그래프 선택을 JSL과 연결하는 방법은 무엇입니까?안녕하세요 여러분!
저는 Application Builder를 사용하고 있으며 Graph Builder를 사용하여 스크립팅한 여러 가지 플롯이 있습니다. 많은 그래프가 Python을 사용하여 작동되고 JMP로 다시 전송된 다양한 데이터 테이블을 사용하고 있습니다. 데이터는 Python에서 중요한 처리를 거치기 때문에 이러한 테이블에는 동일한 변수가 포함되지 않습니다.JSL을 사용하여 이러한 그래프에서 선택 항목을 연결하는 방법을 찾고 있습니다(예: 범례 레이블 중 하나를 선택하면 선택되지 않은 항목이 회색으로 표시됨).
예를 들어, 원시 데이터와 "최종 제품" 데이터를 그래프로 작성하고 있는데 차원이 크게 줄어들고 유사한 기능이 함께 그룹화되어 있으므로 Table1/Graph1에는 30개의 열이 있고 Table2/Graph2에는 3개만 있을 수 있습니다. Table2 변수가 있는 목록 상자가 있고 Variable1을 선택하면 Graph2에서 Variable1을 강조 표시하고 Graph1에서 관련 정보도 강조 표시하고 싶습니다. 강조 표시할 관련 열/행을 결정할 수 있지만 그래프에서 이러한 선택 항목을 실제로 설정하는 방법을 찾을 수 없었습니다. 그래프에서 범례 레이블 중 하나를 선택하고(선택하지 않은 항목은 자동으로 회색으로 표시됨) 다른 그래프에서 관련 정보를 선택하도록 스크립트를 작성할 수 있다면 좋을 것입니다.
이와 같은 그래프에서 무언가를 강조 표시하는 JSL 라인이 있습니까?
대량 맞춤화Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?행 상태 처리기는 모든 행 상태 변경에서 트리거됩니다. 따라서 1개의 행을 선택하면 (적어도) 두 개의 이벤트가 트리거됩니다. 하나는 선택 해제하고 하나는 선택합니다. 아마도 이것은 몇 가지 문제를 일으키고 매우 쉽게 루프를 일으킬 수 있습니다. 특정 이벤트(선택, 선택 취소, 숨기기, 제외...)만 캡처할 수 있다면 작동할 수도 있습니다.
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?알겠어요... 정보 주셔서 감사합니다! 행 상태 핸들러에 대한 이 장을 닫고 있으므로 위에서 제공된 "<< 그래픽 스크립트 추가" 아이디어를 이번에는 플래그와 함께 시도하기로 결정했습니다. 플래그 없이 구현하면 위에서 다루었던 것과 동일한 (나쁜) 동작을 보이는 것 같지만 ~와 함께 플래그 작동하는 것 같습니다!
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
그래픽 연결을 확장함에 따라 이것이 계속 작동하기를 바랍니다. 행 상태 처리기가 계속해서 "선택"을 계속해서 가져오는 이유(따라서 그래프와 고정 JMP 사이에 루프 생성)와 그래픽 스크립트의 동일한 JSL이 그렇지 않은 이유를 알고 계십니까?
정말 도움을 주셔서 감사합니다 @jthi & @txnelson !
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?Enhanced Log에서 "유용한" 메시지를 생성하도록 관리됨

Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?Row State Handlers와 관련하여 그다지 재미 있지 않은 일이 있습니다(제 생각에는 상당히 나쁘게 작동하지 않기 때문에 항상 피하려고 합니다). Big Class에서 단일 행을 클릭하여 제공한 예제를 실행하고 JMP 로그를 확인하십시오.
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?그것이 내가 시도한 것이지만 상태/행 상태 처리기/플래그를 충분히 이해하지 못하는 것 같습니다. 위에서 설명한 동영상을 첨부했습니다. 표시된 그래프는 f2 및 dt2와 관련이 있습니다.
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);처음에는 드래그가 완료될 때까지 새로운 점이 추가될 때마다 선택이 변경되기 때문에 드래그가 문제의 원인이라고 생각했지만 로그의 "group_selected" 출력을 기준으로 선택이 변경되는 것 같지도 않습니다. . 루프가 행 상태 처리기 내에서 새 선택 항목을 추가하기 때문인 것 같지만 서로를 가리키는 두 그래프(그리고 결국 더 많은 것)의 목표를 달성하기 위해 이것을 피하는 방법을 모르겠습니다.
모든 제안을 환영합니다.
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?Show() 문을 사용하여 로그에 플래그 상태를 표시한 다음 타이밍 문제가 있는 위치를 확인할 수 있는지 확인하기 위해 끌기를 수행합니다.
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?답장을 보내 주셔서 감사합니다. @txnelson ! 플래그를 사용하는 것이 좋습니다. 불행히도 여전히 일부 재귀 문제가 있습니다 ... 나는 플래그 변수의 다른 위치를 엉망으로 만들었고 내가 가지고 놀고 있는 JSL에 대한 제한된 이해로 이 현재 구문이 나에게 가장 적합합니다(의사 코드가 구조화되는 방식과 거의 동일함).여기 내 것이 있습니다.
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />범례 레이블을 클릭하여 선택(예!)하고 플롯에서 개별 마커를 클릭하여 단일 선택을 수행하는 경우(예!) 위와 같이 작동하지만 선택 창을 드래그하여 선택을 시도하면 루프에 들어갑니다. 실제 플롯에서(내 사용자의 가장 가능성이 높은 시나리오).내 플래그 변수는 각각의 개별 기능마다 달라야 합니까? 내가 설명한 대로 현재 작동하도록 할 수 있는 유일한 방법은 동일한 플래그 변수를 사용하는 것입니다... 내가 간과하고있는 것이 있습니까?
또한 아무 것도 클릭하지 않고 마우스를 그래프 위로 가져가면 "already_run" 플래그 변수가 어떻게든 변경되는 것 같습니다. 행 상태 처리기의 작동 방식 때문입니까?
당신의 도움에 감사드립니다!
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?동일한 데이터 테이블에서 생성된 모든 그래프는 그래프 중 하나에 점, 선 등이 선택된 경우 자동으로 점, 선 등이 선택됩니다.
그래프가 2개의 서로 다른 테이블에 있는 경우 각 데이터 테이블에 대해 행 상태 핸들러를 구성할 수 있습니다.순환 인수에 대한 귀하의 진술은 정확하지만 이것을 처리하는 방법은 순환의 지속을 방지하는 각 핸들러에 플래그를 설정하는 것입니다.
다음은 설정 방법에 대한 아이디어를 제공하는 간단한 의사 코드입니다.
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?Graph1의 선택 항목이 Graph2의 관련 정보를 강조 표시하는 방식으로 행 상태 처리기를 사용하는 방법이 있습니까? 그리고 그 반대? 어느 쪽이든 할 수 있지만 둘 다 하고 싶다면 JMP를 동결시키는 순환 논쟁이 되는 것 같습니다....순환 인수가 발생하지 않는 다른 그래프/데이터 테이블을 가리키는 현명한 방법이 있습니까?
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?Graph Builder, Bivariate 등의 그래프에서 점 또는 선을 선택하면 관련 데이터 테이블에서 선택 항목과 관련된 행이 선택됩니다.이는 테이블이 표시되는지 여부와 관계가 없습니다.따라서 행 선택의 변경이 감지될 때마다 실행되는 행 상태 처리기를 구현하는 것은 매우 간단한 문제입니다.
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?응답해 주셔서 감사합니다. @jthi ! 그래프에서 선택한 항목에서 선택한 행/열/인덱스 등을 결정하는 방법이 없다면 이러한 솔루션이 내 경우에 적용 가능한지 잘 모르겠습니다. 내 앱에서 사용되는 데이터 테이블이 사용자가 선택할 수 있도록 표시되지 않습니다... 아이디어는 시각화와 인터페이스하는 것이며 코드는 배후에서 테이블에 대한 모든 조작을 수행합니다.
그래프 선택을 위해 "<< Get Selected"를 반복해야 한다고 생각하지만 스크립팅 인덱스에서 올바른 구현을 찾지 못했습니다. 이에 대한 JSL 라인이 있는 경우 언급한 "<< 그래픽 스크립트 추가" 아이디어는 선택이 완료되면 꽤 잘 작동할 수 있다고 생각합니다!
Re: 그래프 선택을 JSL과 연결하는 방법은 무엇입니까?저는 Application Builder를 사용한 적이 없지만 Row State Handlers를 사용할 수 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
다른 옵션은 그래프 스크립트를 사용하는 것입니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
또 하나의 옵션은 가상 조인을 사용하는 것이지만 이를 위해서는 데이터 테이블을 어딘가에 저장해야 합니다.