2022_Q1 MakeOverChallenge:さまざまな方法でのマウスクリックに対するアクションこれは、2022年第1四半期の変身チャレンジです。
目標は、3つのタスクのいずれかを実行するための例、スクリプト、またはガイドを作成することです(すべて、JMPで何かをクリックした後に何らかのアクションを開始する必要があります)。
- 課題A: (添付された画像を開くための初期データテーブルを作成するための画像とスクリプト:2022Q1_ChallengeA.zip)
- あなたが持っているもの:画像またはウェブサイトまたはファイルへのリンク(別名式)を含むデータテーブル列
- この列の1つのセルをクリックして、JMPの外部にあるリンクまたは画像を開きます。
- 全体的な目標:データテーブルのセルをクリックすると、何かが開始されます
- チャレンジB : (データテーブルを開き、添付されたレポートを作成するためのスクリプト:2022Q1_ChallengeB_starterScript.jsl)
- あなたが持っているもの:ビッグクラスと身長別の体重のグラフビルダーレポート(スクリプトを参照)
- 必要なもの:Graph Builderレポートを閉じると、「年齢」の配布レポートが開き、このレポートを画像として保存して、配布レポートを閉じる必要があります。
- 全体的な目標:ウィンドウを閉じると、何らかのアクションがトリガーされるはずです
- 課題C: (データテーブルを開き、添付されたレポートを作成するためのスクリプト:2022Q1_ChallengeC_starterScript.jsl)
- 成長測定のサンプルデータに関するグラフビルダーレポート。
- 必要なもの:1つの行をクリックするか、複数の行(または凡例のカテゴリ)を選択するときに、選択した行のサブセットを生成する必要があります。
- 全体的な目標:グラフまたはレポートをクリックすると、何らかのアクションがトリガーされるはずです
あなたは好きなだけ多くの挑戦に取り組むことができます。 このスレッドへの返信として、回答を直接送信できます/送信する必要があります。
!!! 送信するときは、最初の行から返信の内容から始めてください。例:
課題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:
サブセットの作成が多すぎるのを防ぐため、ボタンを使用してこのようなことを行うことを強くお勧めします。 しかし、ここで私は与えられた課題に従い、少なくとも同じサブセットを2回作成しないという簡単なチェックを追加しました。
もっと見る...
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);
*/
行状態ハンドラーでは、マウスリリースのイベントにアクセスできないため、ユーザーがグラフから複数の線を1つずつ選択した場合でも、多くのサブセットを作成します(Mouse Box()でこれを行う方法があるかもしれませんが、ボタンを使用するとはるかにシンプルで簡単になります)。