データフィルター GUI のスクリプトを作成する方法空の列に設定されたデータフィルターがあります。
考え方としては、ユーザーが何かを行うとその列がデータを取得し、ユーザーはその列に欠落している項目がなくなるまで続行するというものです。
でも問題があるんです。 データ フィルタが条件付きに設定されている場合、すべてがうまく見えますが、ユーザーが条件付き列を更新した瞬間に、JMP は正気を失い、持っていたすべてのフィルタの選択肢を破棄します。
私の「イベント」は現在のフィルター状態をキャプチャし、この望ましくない「更新」に対処するためにフィルター選択を再設定する必要があると思います。
問題は、Data Fitler GUI 要素がユーザー エクスペリエンスと同期しなくなってしまうため、行選択メカニズムを使用したくないことです。
「WHERE CLAUSE」要素に対して REGEX を使用して、リセットする必要があるフィルター設定を取得しましたが、データフィルター GUI を操作するメカニズムが見つかりません。
私が見つけたすべての答えは、JSL スクリプトの行状態に関係しています。
JMP 16.1を使用しています
スクリプト作成ウィンドウズRe: データフィルター GUI のスクリプト作成方法素晴らしいです、ありがとう
Re: データフィルター GUI のスクリプト作成方法あなたの例では、ローカル データ フィルターはグラフ ビルダー内にありますが、それを別の要素に移動すると、もう少し柔軟性が高まります。たとえば、次のように、関数の実行後に削除して再描画できます。
Names Default To Here(1);
dt = open("$sample_data\Iris.jmp");
dt << New Column( "MY_COL",Character);
break_the_filter_fn = Function( {},
dt << select rows( {1, 2, 3, 4, 5} );
dt2 = dt << Subset( Output Table( "just_some_rows" ), Selected Rows( 1 ) );
dt2:MY_COL[{1, 2, 3, 4, 5}] = "banana";
dt << Update( with( dt2 ), Match Columns( :sepal length == :sepal length, ) );
close(dt2,nosave);
a_window << Bring Window to Front;
);
a_window = New Window( "a_window",
data filter context box(
H List Box(
ldflb = h list box(
ldf = dt << data filter(
Local,
Conditional,
Add Filter(
columns( :Species, :Sepal length, :Sepal width ),
Modeling Type( :Sepal length, Nominal ),
Modeling Type( :Sepal width, Nominal ),
Where( :Species == {"setosa", "versicolor"} ),
Where( :Sepal length == {5, 5.1, 5.2, 5.3, 5.4, 5.5} ),
Display( :Sepal length, N Items( 15 ), Find( Set Text( "" ) ) ),
Display( :Sepal width, N Items( 15 ) )
)
)
),
MY_GRAPH_BUILDER = dt << Graph Builder(
Size( 531, 456 ),
Show Control Panel( 0 ),
Variables( X( :Sepal length ), Y( :Sepal width ) ),
Elements( Points( X, Y, Legend( 3 ) ) )
),
Panel Box( "a btn box",
Lineup Box( N Col( 1 ), Spacing( 3 ),
Button Box( "break the filter",
wc = ldf << get script;
break_the_filter_fn();
(ldflb << Child) << Delete Box;
ldfExpr = Eval Expr( ldflb << Append( ldf = dt << Expr( Name Expr(wc) ) ) );
Eval( ldfExpr );
)
)
);
);
)
);
Re: データフィルター GUI のスクリプト作成方法はい、そのとおりです。テーブルの行が新しいデータで更新された場合でも、12 フィルターを維持したいのです。 AND 条件が true に設定されている
現在、JMP は、条件が true に設定されている場合、テーブル更新時にデータ フィルターを完全にクリアします。 条件がオフの場合、すべてが正常で、動作は期待どおりになります。
したがって、既存のグラフがあり、ユーザーはグラフを操作してグラフの背後にあるメインデータテーブルの新しい状態を生成します。ユーザーが新しい状態をコミットすると、変更を加えて新しいテーブルを作成し、新しい状態でメインテーブルを更新しますテーブル。
このイベントにより、JMP はメイン テーブルで行ったフィルタ選択を破棄します。
したがって、私が行うことは、更新イベントの前にデータフィルターの状態をキャプチャし、更新を実行してからデータフィルターの状態をリセットして、その間にフィルターがクリアされたことにユーザーが気付かないようにすることです。
「条件付き」が false に設定されている限り、これはデータ フィルターではまったく問題なく機能します。
ただし、条件を true に設定すると、実行内容に関連する行数に関する有用なデータがデータ フィルターに提供されるためです。
これは私の例ですが、なぜフィルターをリセットする必要があるのでしょうか? ユーザーがフィルターをリセットしないようにするにはどうすればよいですか?
Names Default To Here( 1 );
dt = Open( "$sample_data\Iris.jmp" );
dt << New Column( "MY_COL", Character );
break_the_filter_fn = Function( {},
dt << select rows( {1, 2, 3, 4, 5} );
dt2 = dt << Subset( Output Table( "just_some_rows" ), Selected Rows( 1 ) );
dt2:MY_COL[{1, 2, 3, 4, 5}] = "banana";
dt << Update( with( dt2 ), Match Columns( :sepal length == :sepal length, ) );
//close(dt2,nosave);
);
a_window = New Window( "a_window",
H List Box(
MY_GRAPH_BUILDER = Graph Builder(
Size( 531, 456 ),
Show Control Panel( 0 ),
Variables( X( :Sepal length ), Y( :Sepal width ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :Species, :Sepal length, :Sepal width ),
Modeling Type( :Sepal length, Nominal ),
Modeling Type( :Sepal width, Nominal ),
Where( :Species == {"setosa", "versicolor"} ),
Where( :Sepal length == {5, 5.1, 5.2, 5.3, 5.4, 5.5} ),
Display( :Sepal length, N Items( 15 ), Find( Set Text( "" ) ) ),
Display( :Sepal width, N Items( 15 ) )
)
)
);
Panel Box( "a btn box",
Lineup Box( N Col( 1 ), Spacing( 3 ),
Button Box( "break the filter", break_the_filter_fn() )
)
);
)
);
Re: データフィルター GUI のスクリプト作成方法あなたの質問を理解しようとしているのですが、ユーザーが下のウィンドウで高さ制限を変更した場合に 12 が選択されたままになりたいということですか?

Names Default To Here( 1 );
dt = Open( "$Sample_data/big class.jmp" );
dt << Data Filter(
Location( {397, 156} ),
Conditional,
Add Filter(
columns( :height, :age ),
Where( :height >= 50 & :height <= 55 ),
Where( :age == 12 )
)
);