2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작2022년 1분기 메이크오버 챌린지입니다.
목표는 세 가지 작업 중 하나를 수행하기 위한 예제, 스크립트 또는 가이드를 만드는 것입니다(모두 JMP에서 무언가를 클릭한 후 일부 작업을 시작하는 것과 관련이 있음).
- 도전 과제 A: (이미지 및 이미지 열기를 위한 초기 데이터 테이블 생성 스크립트 첨부: 2022Q1_ChallengeA.zip)
- 가지고 있는 것: 웹사이트 또는 파일(일명 표현식)에 대한 이미지 또는 링크가 있는 데이터 테이블 열
- 원하는 것: 이 열의 한 셀을 클릭하고 JMP 외부의 링크 또는 이미지 열기
- 전반적인 목표: 데이터 테이블 셀을 클릭하면 무언가가 시작되어야 합니다.
- 챌린지 B : (데이터 테이블을 열고 첨부된 보고서를 생성하는 스크립트: 2022Q1_ChallengeB_starterScript.jsl)
- 보유: 키에 따른 체중에 대한 Big Class 및 Graph Builder 보고서(스크립트 참조)
- 원하는 것: 그래프 작성기 보고서를 닫으면 "나이"의 분포 보고서가 열리고 이 보고서를 그림으로 저장하고 분포 보고서를 닫아야 합니다.
- 전반적인 목표: 창을 닫으면 일부 작업이 트리거되어야 합니다.
- 도전 C: (데이터 테이블을 열고 첨부된 보고서를 생성하는 스크립트: 2022Q1_ChallengeC_starterScript.jsl)
- 보유: 성장 측정 샘플 데이터에 대한 그래프 빌더 보고서.
- 원하는 작업: 한 줄을 클릭하거나 여러 줄(또는 범례의 범주)을 선택할 때 선택한 행의 하위 집합을 생성하려고 합니다.
- 전체 목표: 그래프 또는 보고서를 클릭하면 일부 작업이 실행되어야 합니다.
원하는 만큼 많은 도전 과제를 수행할 수 있습니다. 이 스레드에 대한 답변으로 직접 답변을 제출할 수 있습니다.
!!! 제출할 때 첫 번째 줄에서 답장이 참조하는 챌린지를 시작하십시오. 예:
과제 A:
이게 내 대답이야...
// this is my code
...
다음 회의(2022년 5월 18일)에서 몇 가지 답변을 제시하고 이 스레드에 대한 솔루션으로 최고의 답변을 표시하겠습니다.
여러분의 제출을 기다립니다 
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작챌린지 C
이것은 내 대답입니다. 아래 전체 스크립트를 참조하십시오.
아래쪽 부분은 작업을 트리거하는 행 상태 핸들러를 테이블에 추가합니다(스크립팅 인덱스의 예 참조).
Names Default To Here( 1 );
// Open Data Table
dt = Open( "$SAMPLE_DATA/Growth Measurements.jmp", invisible );
// Report snapshot: Growth Measurements - Graph Builder
gb = dt << Graph Builder(
Size( 522, 452 ),
Show Control Panel( 0 ),
Legend Position( "Bottom" ),
Graph Spacing( 8 ),
Variables( X( :Age ), Y( :Growth ), Overlay( :Subject ) ),
Elements( Line( X, Y, Legend( 13 ) ) )
);
// This is my code (Georg)
// (see Scripting Index "Make Row State Handler")
// Define a function, that does the action
f = Function( {a},
Current Data Table() << Subset( Selected Rows( 1 ), Selected columns only( 0 ) )
);
// Set up a row state handler, that triggers the execution of a function on any change of row states,
// a change on row selection by clicking on a line in Graph Builder is a change of row states in the table
rs = dt << make row state handler( f );Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작챌린지 C
마우스박스로는 뭔가 선택이 안되서 행상태 핸들러로 바꿨습니다
Names Default To Here( 1 );
// Open Data Table
dt = Open( "$SAMPLE_DATA/Growth Measurements.jmp", invisible );
// Report snapshot: Growth Measurements - Graph Builder
gb = dt << Graph Builder(
Size( 522, 452 ),
Show Control Panel( 0 ),
Legend Position( "Bottom" ),
Graph Spacing( 8 ),
Variables( X( :Age ), Y( :Growth ), Overlay( :Subject ) ),
Elements( Line( X, Y, Legend( 13 ) ) )
);
active_subset = "";
first_subset = "false";
rsh = dt << make row state handler(
Function( {a},
subtbl = dt << Subset( Selected Rows( 1 ) );
gb << Bring Window To Front;
if(
first_subset == "true",
close(active_subset, no save)
);
active_subset = subtbl;
first_subset = "true";
)
);
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작과제 A:
노트: 몇몇 사람들이 이미 보았기 때문에 이 이전 버전을 유지했지만 더 깨끗한 솔루션을 다음과 같이 게시했습니다. 회신하다 이것에.
전혀 예쁜 솔루션은 아니지만 작업을 수행합니다 ... 좀 더 우아한 모습을 보여주길!
이것은 starterScript 다음에 추가될 것입니다:
// Defining the file name for an image placeholder for displaying on the OS when clicking:
pictFileName = Get Default Directory() || "verylonganduselessname.png"; //name for the temp image file (to be deleted at the end)
dtx:Picture << Set Property("tmpFileName", pictFileName); //saving the name so it can be retrieved from within the table
dtx << On Close( Delete File(pictFileName) ); //make sure we erase the temp image file at the end.
// Setting a Click event handler for the column of interest:
dtx:Picture << Set Property(
"Event Handler",
Event Handler(
Click(JSL Quote( Function(
{thisTable, thisColumn, iRow},
pictFileName = thisTable:thisColumn<< Get Property("tmpFileName"); //recover the path for a temp file
thisTable:thisColumn[iRow] << Save Image( pictFileName ); //save cell contents to temp file
Web( "file://" || pictFileName ) // open the image file
)
)
),
Tip(JSL Quote( Function(
{thisTable, thisColumn, iRow},
"click to open";
)
)
)
)
);
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작챌린지 A
내 초기 솔루션으로 총을 쏜 것에 대해 죄송합니다 ... 여기 더 깨끗한 것이 있습니다.
Names Default to Here ( 1 );
//path = <YOUR full="" path="" to="" where="" the="" images="" have="" been="" saved="">;
// eg.
// path = "C:\EventHandlerImages\";
path = "$DOCUMENTS\Scripting\2022Q1\ChallengeA\2022Q1_ChallengeA\";
//==========================================================================
//Multiple File Import is new in JMP 14
{dtx} = Multiple File Import(
<<SET folder=""></SET></YOUR>Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작도전 C
불행히도 도전 과제 A와 B에 관한 한 할 일이 거의 없었습니다. 제공된 솔루션은 완벽해 보였습니다. 그에 반해 C챌린지에서는 아직 개선의 여지가 있다고 느꼈습니다. 내 대답에 몇 마디
- 기본적으로 필요한 코드를 훔쳤습니다. 여기에서 ( @txnelson 다른 많은 스크립터와 마찬가지로 나에게 록 스타입니다)
- 개별 행을 선택하는 것이 더 쉽도록 보이는 데이터 포인트를 포함하여 그래프를 약간 수정했습니다.
- 그래프에서 포인트를 선택한 후 하위 집합이 있는 데이터 테이블이 즉시 열리지 않습니다. 이것은 그래프 아래에 추가된 버튼을 통해 수행됩니다.
수정된 그래프를 포함한 전체 스크립트는 아래를 참조하십시오.
// Open Data Table
dt = Open( "$SAMPLE_DATA/Growth Measurements.jmp",invisible );
// Report snapshot: Growth Measurements - Graph Builder
gb = dt << Graph Builder(
Size( 522, 452 ),
Show Control Panel( 0 ),
Legend Position( "Bottom" ),
Graph Spacing( 8 ),
Variables( X( :Age ), Y( :Growth ), Overlay( :Subject ) ),
Elements(
Points( X, Y, Legend( 17 ), Jitter Limit( 0 ) ), // added markers
Line( X, Y, Legend( 13 ) ) ),
SendToReport( // increased markers to decent size
Dispatch(
{},
"Graph Builder",
FrameBox,
{Marker Size( 6 ), Marker Drawing Mode( "Normal" )}
)
)
);
// my solution (stolen from here: https://community.jmp.com/t5/Discussions/Creating-a-Subset-from-an-Interactive-Graph/td-p/114459)
subsetButton = Button Box( "Dear user, Please press here to create a Subset of the Selected Points immediately",
If( N Rows( dt << get selected rows ) > 0,
dt << subset( selected rows( 1 ), selected columns( 0 ) )
)
);
Report( gb )["Graph Builder"] << append( subsetButton );
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작도전 과제 A:
열 속성 추가를 사용하여 대부분 JMP로 작성된 코드입니다. 또한 URL을 추가하고 여는 방법에 대한 예가 추가되었습니다.
더보기...
Names Default To Here(1);
// Challenge A
path = "2022Q1_ChallengeA"; // path to images
{dtx} = Multiple File Import(
<<SET folder=""></SET>
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작챌린지 B
스크립트 하단에 다음을 추가합니다.
gb << On Close(
dist = dt << Distribution( Nominal Distribution( Column( :age ) ) );
image = dist << Get Picture;
path = "$temp/age_dist.png";
image << Save Picture( path, "png" );
dist << Close Window();
Open( path );
);
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작도전 B:
더보기...
Names Default To Here(1);
// 2022_Q1 MakeOverChallenge: Action on mouse click in various ways
// Challenge B
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//Use expression to make script a bit more clean IF this were to be expanded
create_dist = Expr(
dist = dt << Distribution(Nominal Distribution(Column(:age)), Histograms Only);
wait(1); // add wait so we can see that distribution is created
dist << Save Picture("$TEMP/Big_Class_age_dist.png", png);
dist << Close Window;
);
gb = dt << Graph Builder(
Size(528, 454),
Show Control Panel(0),
Variables(X(:height), Y(:weight)),
Elements(Points(X, Y, Legend(3)), Line Of Fit(X, Y, Legend(5)))
);
gb << On Close(create_dist);
// Open("$TEMP/Big_Class_age_dist.png"); // un-comment to open the image
Re: 2022_Q1 MakeOverChallenge: 다양한 방법으로 마우스 클릭 시 동작도전 C:
너무 많은 하위 집합이 생성되는 것을 방지하므로 버튼을 사용하여 이와 같은 작업을 수행하는 것이 좋습니다. 그러나 여기에서는 주어진 과제를 따르고 동일한 하위 집합을 두 번 이상 만들지 않을 것이라는 간단한 확인을 추가했습니다.
더보기...
Names Default To Here(1);
// Open Data Table
dt = Open("$SAMPLE_DATA/Growth Measurements.jmp", invisible);
gb = dt << Graph Builder(
Size(522, 452),
Show Control Panel(0),
Legend Position("Bottom"),
Graph Spacing(8),
Variables(X(:Age), Y(:Growth), Overlay(:Subject)),
Elements(Line(X, Y, Legend(13)))
);
//initialize some variables
prev_rows = [];
dt_list = {};
f = Function({rows_changed},
//Rowstate 1 is selected row
cur_rows = Loc(dt << Get Row States, 1);
//if no rows are selected, don't try to create subsets
If(N Items(cur_rows) == 0,
return()
);
//compare to previous to prevent opening extensive abmount of subsets
If(N Items(cur_rows) == N Items(prev_rows),
If(All(cur_rows == prev_rows),
return();
);
);
dt_subset = dt << Subset(Output table("selected_rows"), Rows(cur_rows), invisible);
Insert Into(dt_list, dt_subset); //keep list to make closing easier
//attempt to bring gb to front, this won't work perfectly without wait
gb << Bring Window To Front;
dt_subset << Show Window(1);
//it is enough if we update prev_rows only when subset was created
prev_rows = cur_rows;
);
rs = dt << make row state handler(f);
/* run this to close all data tables
For Each({dt_ref}, dt_list,
Try(Close(dt_ref, no save), Show(exception_msg));
);
Close(dt, no save);
*/
Row State Handler를 사용하면 마우스 해제 이벤트에 액세스할 수 없으므로 사용자가 그래프에서 여러 줄을 하나씩 선택하면 여전히 많은 하위 집합을 생성합니다(마우스 상자()를 사용하여 이 작업을 수행하는 방법이 있을 수 있지만 버튼을 사용하면 훨씬 간단하고 쉽습니다).