データ フィルター コンテキスト ボックスで行状態ハンドラーが期待どおりに動作しない親愛なるコミュニティの皆様、
データフィルターコンテキスト/ソースボックスを使用してダッシュボードを構築しようとしています。
いくつかの詳細においては期待通りに動作します。
しかし、選択内容に基づいて、タブ ページ ボックスの詳細 1 にある追加のテーブルをフィルター処理する必要があるため、追加の機能が必要です。
そのコンテキストで Make Row State Handler を使用して、毎回それを再作成します。
Tabulate で単一の行を選択すると、すべて正常ですが、次のようになります。
- すべて選択を解除してもタブページボックスは変化しない
- Tabulate で複数の行を選択すると、タブ ページ ボックスで間違った選択が発生します。
- GraphBuilderでポイントを選択すると、テーブル生成が過剰に行われる
- ...
このシナリオをより堅牢にするにはどうすればよいでしょうか?
Tabulate および Graph Buildereer で選択された行を取得する別の方法 (行状態ハンドラーなし) はありますか?
このようなことを行うためのより良い戦略はありますか?
ありがとう、BR
Names Default To Here( 1 );
Clear Log();
dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
dt << show window( 0 );
tabulate_expr = Expr(
tb_obj = dt << Tabulate( Show Control Panel( 0 ), Add Table( Row Table( Grouping Columns( :sex, :age ) ) ) )
);
gb_expr = Expr(
gb_obj = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 3 ) ), Smoother( X, Y, Legend( 4 ) ) )
)
);
action_expr = Expr(
Button Box( "Start Analysis", Print( pb_details << get row states() ) )
);
nw = New Window( "Dashboard",
Data Filter Context Box(
H List Box(
V List Box(
H List Box(
Panel Box( "Filter (in Data Filter Source Box)", /* Filter and GB */ dfsb =
Data Filter Source Box( tabulate_expr )
),
Panel Box( "Graph Builder (to be filtered in context", gb_expr )
),
Panel Box( "Action", /* Action */ action_expr )
),
pb_details = Panel Box( "Details (as well in data filter context box)", /* Tab Box */
Tab Box(
Tab Page Box( "Details1 (Data Grid Box, update via Make Row State Handler)", dgb = Data Grid Box() ),
Tab Page Box( "Details2 (Filtered automatically)", tabulate_expr )
)
)
)
)
);
detail_dt = dt << subset( invisible, columns( {"name", "age", "sex"} ) );
dgb << set data table( detail_dt );
dgb << close side panels;
nw << on close(
Close( dt, NoSave );
Close( detail_dt, NoSave );
For Each( {dt}, detail_dt_lst, Try( Close( dt, NoSave ) ) );
);
last_a = []; /* remember last selection to avoid double action */
detail_dt_lst = {}; /* save all table references to be able to close later */
details_update = Function( {a},
If( Is Matrix( a ) & Char( a ) != Char( last_a ),
Show( a );
detail_old = dgb << Get Data Table();
detail_dt = dt << subset( invisible, columns( {"name", "age", "sex"} ) );
Insert Into( detail_dt_lst, detail_dt );
detail_dt << select rows( a ) << delete rows();
dgb << set data table( detail_dt );
dgb << close side panels;
Close( detail_old, NoSave );
last_a = a;
);
);
rsh = pb_details << Make Row State Handler( dt, details_update );
自動化とスクリプトウィンドウズRe: データ フィルター コンテキスト ボックスで行状態ハンドラーが期待どおりに動作しない私の意見では、行状態ハンドラーにはさまざまな問題があり、堅牢にすることはできません (たとえば、簡単に削除されすぎたり、トリガーが多すぎたり、その他多くの問題があります)。発生している問題の一部を回避するには、行状態ハンドラーの関数で使用できるパラメーター(この場合は a)を使用せず、代わりに << Get Selected Rows を使用します。
ダッシュボードに表とグラフ ビルダーがあり、これらを使用してデータ テーブルをフィルター処理したいとお考えですか? フィルター処理されるデータ テーブルは必要ですか? すべての問題を回避する最も簡単な方法は、ボタン ボックスを使用してテーブルを更新することです。
Re: データ フィルター コンテキスト ボックスで行状態ハンドラーが期待どおりに動作しない実際の使用例に応じて、これが機能する可能性のある1つのオプションです。サブセットを再作成するのではなく、更新することに依存します。また、「a」パラメータに依存せずに、選択された行をチェックします。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA\Big Class.jmp", Invisible);
tabulate_expr = Expr(
tb_obj = dt << Tabulate(
Show Control Panel(0),
Add Table(Row Table(Grouping Columns(:sex, :age)))
)
);
gb_expr = Expr(
gb_obj = dt << Graph Builder(
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4)))
)
);
action_expr = Expr(
Button Box("Start Analysis", Print(pb_details << get row states()))
);
nw = New Window("Dashboard",
Data Filter Context Box(
H List Box(
V List Box(
H List Box(
Panel Box("Filter (in Data Filter Source Box)",
dfsb = Data Filter Source Box(tabulate_expr)
),
Panel Box("Graph Builder (to be filtered in context",
gb_expr
)
),
Panel Box("Action",
action_expr
)
),
pb_details = Panel Box("Details (as well in data filter context box)",
Tab Box(
Tab Page Box(
"Details1 (Data Grid Box, update via Make Row State Handler)",
dgb = Data Grid Box()
),
Tab Page Box("Details2 (Filtered automatically)",
tabulate_expr
)
)
)
)
)
);
detail_dt = dt << subset(invisible, columns({"name", "age", "sex"}));
dgb << set data table(detail_dt);
dgb << close side panels;
nw << on close(
Close(dt, NoSave);
Close(detail_dt, NoSave);
);
last_rows = {}; // use list as you can compare those directly
extra_triggers = 0;
details_update = Function({a},
// Write("\!N", Round(Tick Seconds(), 2), " \!thappy state handler triggering");
// Show(dt << Get Row States);
cur_rows = As List(dt << Get Selected Rows);
If(N Items(cur_rows) == 0,
cur_rows = As List((1::N Rows(dt))`); // same as all rows selected
);
If(cur_rows == last_rows,
extra_triggers++;
return();
);
Write("\!N", extra_triggers, " unnecessary triggers occured.");
extra_triggers = 0;
last_rows = cur_rows;
If(N Rows(detail_dt) > N Items(cur_rows),
detail_dt << Delete Rows(N Items(cur_rows) + 1::N Rows(detail_dt));
, N Rows(detail_dt) < N Items(cur_rows),
detail_dt << Add Rows(N Items(cur_rows) - N Rows(detail_dt));
);
detail_dt[0, {"name", "age", "sex"}] = dt[Matrix(last_rows), {"name", "age", "sex"}];
);
rsh = pb_details << Make Row State Handler(dt, details_update);
これはこれを行う唯一の方法ではありませんが、試してみることができる非常に簡単なオプションです。
状態ハンドラーがいつか使用可能になることを期待するウィッシュリスト項目: JMP の状態ハンドラー (ホバー ラベル、行状態ハンドラー、フィルター状態ハンドラー、スケジューラーなど) を改善します。
Re: データ フィルター コンテキスト ボックスで行状態ハンドラーが期待どおりに動作しない混乱の原因の1つは、 < < m>引数を解釈する方法です。ベクトルは変更された行を表しますが、行の状態については何も示しません。また、フィルター以外のイベント (テーブルでの選択、ラベル、またはマーカー行の状態の変更など) のコールバックも受け取ります。これにより、関心のあるイベントへの応答を制限することが難しくなります。
このような背景から、元のスクリプトの主な問題は、(1) 同じ引数で関数が連続して呼び出されたときに応答しない (これが clear が機能しない理由です)、(2) 削除する行として行番号を使用していることだと思います。
以下のスクリプト (注意: JMP 18 以降のみ) は変更を追跡して制限しようとはしませんが、実際に除外された行をサブセットから削除して正しく応答するはずです。
Names Default To Here( 1 );
Clear Log();
//https://community.jmp.com/t5/Discussions/Make-Row-State-Handler-not-working-as-expected-in-a-Data-Filter/m-p/791520
dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
dt << show window( 0 );
tabulate_expr = Expr(
tb_obj = dt << Tabulate( Show Control Panel( 0 ), Add Table( Row Table( Grouping Columns( :sex, :age ) ) ) )
);
gb_expr = Expr(
gb_obj = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 3 ) ), Smoother( X, Y, Legend( 4 ) ) )
)
);
action_expr = Expr(
Button Box( "Start Analysis", Print( pb_details << get row states() ) )
);
nw = New Window( "Dashboard",
Data Filter Context Box(
H List Box(
V List Box(
H List Box(
Panel Box( "Filter (in Data Filter Source Box)", /* Filter and GB */ dfsb =
Data Filter Source Box( tabulate_expr )
),
Panel Box( "Graph Builder (to be filtered in context", gb_expr )
),
Panel Box( "Action", /* Action */ action_expr )
),
pb_details = Panel Box( "Details (as well in data filter context box)", /* Tab Box */
Tab Box(
Tab Page Box( "Details1 (Data Grid Box, update via Make Row State Handler)", dgb = Data Grid Box() ),
Tab Page Box( "Details2 (Filtered automatically)", tabulate_expr )
)
)
)
)
);
detail_dt = dt << subset( invisible, columns( {"name", "age", "sex"} ) );
dgb << set data table( detail_dt );
dgb << close side panels;
nw << on close(
Close( dt, NoSave );
Close( detail_dt, NoSave );
For Each( {dt}, detail_dt_lst, Try( Close( dt, NoSave ) ) );
);
detail_dt_lst = {}; /* save all table references to be able to close later */
details_update = Function( {a},
Show( a );
If( Is Matrix( a ),
detail_old = dgb << Get Data Table();
detail_dt = dt << subset( invisible, columns( {"name", "age", "sex"} ) );
Insert Into( detail_dt_lst, detail_dt );
filter_state = pb_details << Get Row States(dt);
detail_dt << select rows( Where(Excluded(As Row State(filter_state))) ) << delete rows();
dgb << set data table( detail_dt );
dgb << close side panels;
Close( detail_old, NoSave );
);
);
rsh = pb_details << Make Row State Handler( dt, details_update );
Re: データ フィルター コンテキスト ボックスで行状態ハンドラーが期待どおりに動作しないご提案ありがとうございます。ボタンボックスが解決策になると思います。
選択肢は2つあります。
(1)GUIの起動時に必要なすべての詳細を読み込み、それらを隠しテーブルとして保持し、特定のコンテキストで必要な部分を表示するには、rowstateなどを使用した動的なソリューションを選択します。
(2)リクエストに応じてデータベースからデータをロードします(ここではボタンソリューションを選択します)。
しかし、このケースは私にとって全体的に非常に興味深いものです。なぜなら、(1) または (2) を好む類似のケースが多数あり、JMP がそれに対してどのように機能するかをよりよく理解したいからです。
Re: データ フィルター コンテキスト ボックスで行状態ハンドラーが期待どおりに動作しない@jthiと@danschikoreのご意見に感謝します。ダッシュボードを改善するための素晴らしいアイデアが得られました。