데이터 필터 컨텍스트 상자에서 행 상태 처리기가 예상대로 작동하지 않도록 만들기친애하는 커뮤니티 여러분,
데이터 필터 컨텍스트/소스 상자를 사용하여 대시보드를 구축하려고 합니다.
그리고 일부 세부 사항은 예상대로 작동합니다.
하지만 추가 기능이 필요해서, 선택에 따라 추가 표를 필터링해야 합니다. 이 표는 탭 페이지 상자 세부 정보 1에 있습니다.
그 컨텍스트에서 Make Row State Handler를 사용하여 매번 다시 생성합니다.
Tabulate에서 단일 행을 선택하면 모든 것이 괜찮지만:
- 모든 선택을 해제하면 탭 페이지 상자가 변경되지 않습니다.
- Tabulate에서 여러 줄을 선택하면 Tab Page Box에서 잘못된 선택이 발생합니다.
- GraphBuilder에서 포인트를 선택하면 테이블 생성이 과도하게 수행됩니다.
- ...
이 시나리오를 더욱 견고하게 만들려면 어떻게 해야 할까?
Tabulate 및 Graph Builder에서 선택한 행을 가져오는 다른 방법(행 상태 처리기 없음)이 있습니까?
이런 일을 하기 위한 더 나은 전략이 있을까요?
감사합니다. 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를 사용하고 대신 << 선택된 행 가져오기를 사용하세요.
그래서 당신은 표와 그래프 빌더가 있는 대시보드를 원하고 이것들이 데이터 테이블을 필터링해야 합니까? 필터링되는 데이터 테이블이 필요합니까? 모든 문제를 피하는 가장 쉬운 방법은 버튼 상자를 사용하여 테이블을 업데이트하는 것입니다.
Re: 데이터 필터 컨텍스트 상자에서 행 상태 처리기가 예상대로 작동하지 않음실제 사용 사례에 따라 작동할 수 있는 옵션이 하나 있습니다. 하위 집합을 다시 만드는 대신 업데이트하는 데 의존합니다. 또한 "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: 데이터 필터 컨텍스트 상자에서 행 상태 처리기가 예상대로 작동하지 않음< 와 혼동의 한 가지 원인 < 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: 데이터 필터 컨텍스트 상자에서 행 상태 처리기가 예상대로 작동하지 않음제안해 주셔서 감사합니다. 버튼박스가 해결책이 될 것 같습니다.
나에게는 두 가지 선택이 있다.
(1) GUI를 시작할 때 필요한 모든 세부 정보를 로드하고 이를 숨겨진 표로 유지하며 특정 컨텍스트에서 필요한 부분을 표시합니다. 여기서는 행 상태 등을 사용한 동적 솔루션을 사용할 것입니다.
(2) 요청 시 데이터베이스에서 데이터를 로드합니다(여기서는 버튼 솔루션을 선택합니다).
하지만 이 사례는 저에게 일반적으로 매우 흥미로웠습니다. 왜냐하면 저는 (1) 또는 (2)를 선호하는 유사한 사례가 많고 JMP가 이와 어떻게 작동하는지 더 잘 이해하고 싶었기 때문입니다.
Re: 데이터 필터 컨텍스트 상자에서 행 상태 처리기가 예상대로 작동하지 않음@jthi 와 @danschikore 님 , 여러분의 의견에 감사드립니다. 이를 통해 대시보드를 개선하기 위한 좋은 아이디어를 얻을 수 있었습니다.