数据过滤器在 for 循环中停止我正在编写一个 for 循环脚本,用于搜索在不同实验条件下收集的光谱中某些部分的 y 最大峰值的 x 值。但是,数据过滤器在运行一轮后停止,并显示警告“您的选择已在另一个窗口中更改”。我该如何消除此警告,以便脚本可以顺利运行并完成 for 循环?
我使用 Big Class.jmp 示例来演示这个问题。目标是显示不同年龄(类似于实验条件)的几个身高范围(x 值范围,例如 55-60、60-62、62-65)中体重最大(y 最大值)的人所对应的数据子集。
x 值范围由两个列表分组,一个包含下限,另一个包含上限。最大值由 Col Maximum 和 Data Filter 找到。计算沿着列表循环几个 x 值范围。但是,在运行 for i=1 后,循环停止并出现 Data Filter 警告。如何摆脱它以让脚本完成 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 |
| 爱丽丝 | 十三 | 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(例如通过 Transform Column)。无需数据过滤器...

根据该表,他们是詹姆斯、芭芭拉、朱迪和玛丽安。
如果您想通过数据过滤器定义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 ) ) )
);