从 JSL 操作本地数据过滤器给定一个值列表,我想将这些值写入本地数据过滤器的限制。 这是一个(几乎)工作示例(删除数据过滤器并根据动态构建数据过滤器表达式重新添加),但感觉很复杂,这是最好的方法吗? (它也必须动态地适用于具有不同列数的其他表)
dt = Open("$SAMPLE_DATA\Fitness 3D.jmp");
sm = dt << Scatterplot Matrix(
Y( :Runtime, :RstPulse, :RunPulse, :MaxPulse ),
X( :Age, :Weight, :Oxy ),
Fit Line( 0 ),
Local Data Filter( Add Filter( columns( :Age, :Weight, :Oxy ) ) )
);
ColExp = expr(columns( :Age, :Weight, :Oxy ));
//Modify this expression based on list values
AndExp = expr(Where(:Age >=0 & :Age <=100));
sm << Remove Local Data Filter;
Eval(
Insert(
Expr( Send( sm ) ),
Insert(
Expr( Local Data Filter() ),
Insert(
insert(
expr(Add filter()),
name expr(ColExp)
),
//name expr(WhereExp)
insert(
expr(Where()),
name expr(AndExp)
)
)
)
)
);对于扩展目标,我还想附加一个按钮,按下该按钮会将当前限制从本地数据过滤器读取到列表或矩阵中。
数据探索和可视化回复:从 JSL 操作本地数据过滤器要记住的一件事是,连续过滤器Where()子句可以采用几种不同的形式,具体取决于限制、反转选择设置,以及包括最小/最大设置。这对于设置 where 子句并不重要,但由于您提到读取当前限制,您可能会看到如下表达式:
Select Where( :Age <= 42 | :Age > 55 | Is Missing( :Age ) );
回复:从 JSL 操作本地数据过滤器好的,感谢您确认我没有错过更简单的选项(例如 f[1] << set limit(1, 2);)或其他选项。 那么应该是表达式操作:)
是的,对于按钮,我可能会使用 xpath 来提取所有数字编辑框,并从顺序中我可以推断出它们的含义。 我只是想确保您无法直接查询本地数据过滤器来告诉您限制。
回复:从 JSL 操作本地数据过滤器在这里使用 Substitute 可能是一个更干净的选择。
dt = Open("$SAMPLE_DATA\Fitness 3D.jmp");
sm = dt << Scatterplot Matrix(
Y(:Runtime, :RstPulse, :RunPulse, :MaxPulse),
X(:Age, :Weight, :Oxy),
Fit Line(0),
f = Local Data Filter(Add Filter(columns(:Age, :Weight, :Oxy)))
);
ColExp = Expr(
columns(:Age, :Weight, :Oxy)
);
AndExp = Expr(
Where(:Age >= 0 & :Age <= 50)
);
Eval(Substitute(
sm << Remove Local Data Filter;
Expr(
f = sm << Local Data Filter(
_cols_,
_where_
)
),
Expr(_cols_), Name Expr(ColExp),
Expr(_where_), Name Expr(AndExp)
));
// You can try to parse this for local data filter limits
w = f << Get where clause;
show(w);
对于限制,您可以解析 where 子句,或者访问其中的 DFIntMinMaxBox 和 NumberEditBoxes (我会尝试解析Where 子句)。 可能还有其他方法(显示属性(f)可能有一些想法)。

回复:从 JSL 操作本地数据过滤器此示例适用于(全局)数据过滤器,但它说明了如何添加Where() 参数以按照您想要的方式设置限制。 也就是说你可以在打开过滤器的时候指定约束。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
obj = dt << Data Filter();
obj << Add Filter( columns( :POP ) );
obj << Add Filter(
columns( :Region, :State, :City ),
Where( :Region == "S" ),
Where( :State == {"SC", "NC"} )
);