從 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)
)
)
)
)
);對於拉伸目標,我還想附加一個按鈕,按下該按鈕可將本地數據過濾器中的當前限制讀取到列表或矩陣中。
腳本Re: 從 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"} )
);Re: 從 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)可能有一些想法)。

Re: 從 JSL 操作本地數據過濾器好的,感謝您確認我沒有錯過更簡單的選項(例如 f[1] << set limit(1, 2);) 或其他東西。 然後應該是表達式操作:)
是的,對於按鈕,我可能會使用 xpath 來提取所有 numbereditboxes,並從順序中推斷出它們的含義。 我只是想確保您不能直接查詢本地數據過濾器來告訴您限制。