用于在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式完全披露:我不是编码员,JSL 给我带来了特别困难的时间,但是我觉得我正在编写的这部分脚本应该比以前容易得多。 我经常使用数据过滤器,启用了“查找”和“正则表达式”(见图),但是没有保存这些设置的选项,所以每次我打开过滤器时都必须重新启用它们。 我想要的是一个嵌入式表脚本:
1) 打开数据过滤器
2) 自动添加当前选定的列(即我将选择一个列,然后启动脚本)
3)启用“查找”
4) 启用“正则表达式”

不幸的是,保存脚本选项只保存了这个:
Current Data Table() << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( :name ), Display( :name, Size( 160, 225 ), List Display ) )
);Find 和 Regex 不与脚本一起保存。 . .
但是,这是迫使我寻求帮助的部分,我终其一生都无法弄清楚如何将当前选定的列的名称传递给“columns()”和“Display()”函数。
我试过很多东西,例如这个:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( col_selected ), Display( col_selected, Size( 160, 225 ), List Display ) )
);但我得到一个错误:
“在数据表中找不到指定的列。在访问或评估“列”时,列(col_selected)/*###*/”
可能是因为 col_selected 是一个列表,但我不知道如何从单项列表中获取名称。 真的不应该这么难。
回复:在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式谢谢@马克贝利这也有效,尽管如果选择了多个,它只过滤第一列。 但是,使用您的建议获取列引用使我能够创建一个完全符合我要求的 FOR 循环。
Names Default to Here( 1 );
dt = Current Data Table( );
list = dt << Get Selected Columns( );
obj = dt << Data Filter( );
For( i = 1, i <= N Items( list ), i++,
obj << Add Filter( columns( Column( list[i] ) )
)
);
回复:在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式这条路很曲折。 不过,这并不是唯一可行的方法。 表达式是强大的构造函数,但并不总是必需的。 请记住,Columns() 参数需要一个列引用。 这就是它的全部。 它可能是文字值(列名)、存储在变量中的值或从函数返回的值。
Names Default to Here( 1 );
// open example data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// select a column (mimic result by interactive user)
dt << Go To( :age );
// identify selection
col = dt << Get Selected Columns( String );
// obtain column reference
col = Column( col[1] );
// launch data filter on selected column
df = dt << Data Filter(
Add Filter( Columns( col ) )
);
回复:在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式@ionatx我和你在一起。我自己也为此苦苦挣扎,最终在论坛上找到了解决方案。我的粗略理解是你需要经历所有这些冗长的过程才能将一个表达式插入另一个表达式。 使用您的原始代码,col_selected 永远不会评估。Data Filter() 只看到它无法识别为列标题的字符“col_selected”,因此返回错误“在数据表中找不到指定的列”。因此,您将它包含在 Expr() 中,这表示它是一个需要计算的表达式。然后将整个内容包含在 Eval Expr() 中,以强制计算包含在 Expr() 中的内容。然后将整个 Eval() 包裹起来表达这本质上执行产生所需输出的表达式。这一切都让人感觉非常复杂,但这就是它的工作原理。
你想了解更多吗?https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
回复:在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式@Chris_Rodrigues那行得通,我不明白为什么它起作用了,但它起作用了。
@Jeff_Perkinson谢谢你的跟进,是的,我会的。
回复:在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式@Chris_Rodrigues有一个关于如何让变量在 Data Filter() 消息中进行评估的句柄,我可以确认 JSL 不支持打开 Find 和 Regex 选项。
如果您觉得这很有价值,请务必将其输入JMP 愿望清单.
回复:在当前选定列上打开数据过滤器的脚本,启用查找和正则表达式为了将像 col_selected 这样的变量传递给数据过滤器函数,您必须使用 Eval(Eval Expr(Expr())) 构造。JSL 太奇怪了。但这是它的样子:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
Eval(
Eval Expr(
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( Expr(col_selected) ), Display( Expr(col_selected), Size( 160, 225 ), List Display ) )
);
)
);对于 Find 和 Regex 选项... 我什至怀疑这是否可能。如果您查看脚本指南中的 Data Filter() 文档,则不会提及这些选项。我怀疑脚本界面是否具有这种粒度级别,并且这些复选框只能以交互方式显示。不过,我可能是错的。其他人可能会提出解决方案。