使行狀態處理程序在資料過濾器上下文框中無法如預期工作親愛的社區,
我嘗試使用資料過濾器上下文/來源框來建立儀表板,
它在一些細節上按預期工作。
但我需要其他功能,根據我需要過濾位於選項卡頁面框詳細資料 1 中的附加表的選擇。
我每次都透過在該上下文中使用 Make Row State Handler 來重新建立。
在製表中選擇單行時,一切都很好,但是:
- 當我取消全選時,選項卡頁框不會改變
- 當我在製表中選擇多行時,選項卡頁框中出現錯誤選擇
- 當我在 GraphBuilder 中選擇點時,表格產生過度完成
- …
如何讓這個場景更加健壯?
是否有不同的方法(沒有行狀態處理程序)來取得表格和圖形產生器中選定的行?
有沒有更好的策略來做這樣的事情?
非常感謝,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 );
自動化和腳本編寫視窗回覆:使行狀態處理程序在資料過濾器上下文方塊中無法如預期運作在我看來,行狀態處理程序存在許多不同的問題,因此您無法使它們變得健壯(例如,它們太容易被刪除、觸發太多以及許多其他問題)。為了避免您遇到的一些問題,請不要使用行狀態處理程序(在您的情況下為 a)函數中可以擁有的參數,而是使用 << Get Selected Rows。
那麼您想要擁有帶有表格和圖形生成器的儀表板,並且這些應該過濾資料表嗎?是否需要有一個正在過濾的資料表?避免所有問題的最簡單方法是使用按鈕框來更新表格。
回覆:使行狀態處理程序在資料過濾器上下文方塊中無法如預期運作根據您的實際用例,以下是可能有效的選項。它依賴於更新子集而不是重新建立它。它還會檢查選定的行,而不是依賴“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 的狀態處理程序(懸停標籤、行狀態處理程序、過濾器狀態處理程序、調度程序等)
回覆:使行狀態處理程序在資料過濾器上下文方塊中無法如預期運作與<混淆的一個來源< m>是如何解釋一個論點。此向量表示已變更的行,但它沒有說明它們所處的狀態。這確實使得限制對感興趣事件的反應變得困難。
在這種背景下,我認為原始腳本的主要問題是(1)當使用相同的參數連續調用函數時沒有響應(這就是清除不起作用的原因)和(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 );
回覆:使行狀態處理程序在資料過濾器上下文方塊中無法如預期運作感謝您的建議,按鈕框將是一個解決方案。
我有兩個選擇:
(1) 在啟動 GUI 期間加載我可能需要的所有詳細信息,將它們保留為隱藏表並在特定上下文中顯示我需要的部分,在這裡我將尋求具有 rowstate 等的動態解決方案。
(2) 根據請求從資料庫載入資料(這裡我會選擇按鈕解決方案)。
但這個案例對我來說通常很有趣,因為有很多類似的案例,我更喜歡 (1) 或 (2),我想更了解 JMP 如何使用它。
回覆:使行狀態處理程序在資料過濾器上下文方塊中無法如預期運作非常感謝您的輸入@jthi和@danschikore ,這給了我一些改進我的儀表板的好主意。