資料過濾器在 for 迴圈中停止我正在編寫一個 for 循環腳本來搜尋在不同實驗條件下收集的光譜的某些部分中 y 最大峰值的 x 值。然而,數據過濾器在運行一輪後因警告「您的選擇已在另一個視窗中更改」而停止。如何擺脫這個警告,使腳本能夠順利運行完成for循環?
讓我使用 Big Class.jmp 範例來示範該問題。目標是顯示不同年齡在多個身高範圍(x 值範圍,例如 55-60、60-62、62-65)中具有最大體重(y 最大值)的人對應的資料子集(類似於實驗條件) 。
x 值範圍由兩個清單分組,一個包含下限,另一個包含上限。最大值是透過 Col Maximum 和 Data Filter 找到的。對清單中的幾個 x 值範圍進行循環計算。但是,運行 i=1 後,循環停止並出現資料過濾器警告。如何擺脫它讓腳本完成for循環?
Names Default To Here( 1 );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
for(i=1, i<=3, i++,
dt = Data Table( "Big Class" );
Current Data Table (dt);
a = ListA[i];
b = ListB[i];
dt << Data Filter(Add Filter(columns(:height), where(:height > a & :height < b)), Mode( Select( 0 ), Show( 0 ), Include( 1 )), Show Window(0), Auto Clear(1));
dt << select where (col maximum(:weight, :age, Excluded()) == :weight & :height > a & :height < b);
dt << subset(selected rows(1), columns({"name", "age", "sex", "height", "weight"}));
dt << Clear Row States;
dt << Clear Select();
);
自動化和腳本編寫回覆:資料過濾器在 for 迴圈中停止我相信下面的簡化 JSL 可以滿足您的需求。
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/big class.jmp" );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
For( i = 1, i <= 3, i++,
a = ListA[i];
b = ListB[i];
Current Data Table( dt );
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ) );
dt << select where( theMax == :weight & :height > a & :height < b );
If( N Rows( dt << get selected rows ) > 0,
dt << subset( selected rows( 1 ), columns( {"name", "age", "sex", "height", "weight"} ) )
);
dt << Clear Row States;
Wait( 0 );
);回覆:資料過濾器在 for 迴圈中停止然而,這個腳本沒有「按年齡」功能。例如,在我的腳本中,當 i = 2(ListA = 60,ListB = 62)時,結果為
| 姓名 | 年齡 | 性別 | 高度 | 重量 |
| 詹姆斯 | 12 | M | 61 | 128 |
| 愛麗絲 | 13 | F | 61 | 107 |
| 朱迪 | 14 | F | 61 | 81 |
但是,您的腳本給出了相應的部分
這是因為我的腳本在 Col Maximum 中有“按年齡”部分。不幸的是,即使我在腳本中添加“按年齡”部分:
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ), :age );
出現警報:“行號無效”
您的腳本運行順利。我們如何在腳本中的 Col Maximum 中添加“按年齡”部分?
回覆:資料過濾器在 for 迴圈中停止請查看 Col Max 的文檔 - 實際上它可以完成所需的所有工作。
只需使用輔助列height_bin(例如透過變換列)。不需要資料過濾器...

根據這張表,是 James、Barbara、Judy 和 Marion。
如果您想透過資料過濾器定義 height_bins,請確保您不會錯過連接點,例如 height=60。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "height_bin",
"Character",
Formula(
If(
:height < 60, "<60",
:height <62, "<62",
">=62"
)
) );
New Column( "weight_max",
Formula( Col Maximum( :weight, :age, :height_bin ) )
);
New Column( "is max",nominal,
Formula( :weight == :weight_max ),
);
Graph Builder(
Variables( X( :age ), Y( :weight ), Group Y( :height_bin ) ),
Elements( Bar( X, Y, Label( "Label by Row" ) ) ),
Local Data Filter( Add Filter( columns( :is max ), Where( :is max == 1 ) ) )
);