ユーザーに列を選択させるのは、 JMPスクリプトでよくあるタスクです。スクリプトを作成する際には、最適な方法を決定するために考慮すべき点がいくつかあります。
まず、ウィンドウの外観について考えてみましょう。列を選択する機能に加えて、ユーザーが他のオプションを指定できるようにすべきでしょうか?そして最も重要なのは、ウィンドウの動作をどのようにしたいかということです。
モーダルウィンドウと非モーダルウィンドウ
モーダルウィンドウが表示されると、スクリプトは一時停止し、ユーザーの操作を待ちます。ユーザーがウィンドウを操作して閉じると、スクリプトの残りの部分が実行されます。モーダルウィンドウの例としては、環境設定ウィンドウ(ファイル > 環境設定)があります。JMPは、環境設定ウィンドウが閉じられるまで、他の処理は一切行いません。
非モーダルウィンドウの場合、ウィンドウは開いたままになり、ユーザーの操作を待たずにスクリプトが完了できます。フィットモデルプラットフォームの起動ウィンドウ(分析 > フィットモデル)を考えてみてください。ウィンドウを開いたままにして、JMPで他のタスクを実行できることに注目してください。分析作成後もダイアログを開いたままにするためのチェックボックスもあります。これは非モーダルウィンドウの一例です。ユーザーが列や役割を別の方法で選択できるように、開いたままになる非モーダルウィンドウを使用することもできます。
では、モーダルウィンドウと非モーダルウィンドウのどちらを使用するかはどのように判断すればよいのでしょうか?主な考慮事項は、JMPにユーザー入力を待機させるかどうかです。スクリプトの残りの処理がユーザーの選択に依存する場合は、モーダルウィンドウを使用するのが適切です。モーダルウィンドウを作成するための便利な方法が2つあるので、それぞれの方法を見ていきましょう。
列ダイアログ()
ColumnDialog() は、現在のデータテーブルから列を選択するようユーザーに促すモーダルダイアログをすばやく生成できる組み込み関数です。スクリプト作成者は、ダイアログに表示する表示ボックスの種類を選択するだけで、レイアウトを細かく制御することはできません。以下に、ユーザーに X 列を 2 つと Y 列を 2 つ選択するよう促すスクリプトの例を示します。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
dlg = Column Dialog(
yList = Col List( "Y",
Min Col( 2 ),
Max Col( 2 ),
Data Type( "Numeric" )
),
effectList = Col List( "Effects",
Min Col( 2 ),
Max Col( 3 ),
Data Type( "Numeric" )
)
);
ユーザーに表示されるウィンドウは次のようになります。

スクリプト作成者は、2つの列リスト表示ボックスのオプションのみを指定していることに注意してください。左側の現在のデータテーブルの列リストは、組み込み機能の一部として提供されます。
ユーザーが選択を行い、「OK」をクリックすると、以下のようなユーザーの選択内容のリストが表示されます。
dlg = {yList = {:Age, :Oxy}, effectList = {:RunPulse, :RstPulse}, Button(1)};
リスト内の個々の式は評価されません。したがって、選択した列を使用するには、いくつかの方法で列のリストをアンロードして分析に使用できます。たとえば、 dlgリスト変数に添え字を付けて列リストを新しい変数に割り当てるか、同じ名前を使用できます。
yList = dlg["yList"];
effectList = dlg["effectList"];
列のリストをアンロードするもう1つの方法は、Eval List() を使用して dlg リスト変数内の項目を評価することです。Button (1) は評価する必要がないため、dlg リストの最後の項目は、リスト内の他の項目を評価する前に削除されます。
Eval List( Remove( dlg, -1 ) )
ここでシンボルを表示 () を実行すると、定義されているすべての変数と、列の選択が yList および effectList 変数に格納されていることが確認できます。
// Here
dlg = {yList = {:Age, :Oxy}, effectList = {:RunPulse, :RstPulse}, Button( 1 )};
dt = Data Table( "Fitness" );
effectList = {:RunPulse, :RstPulse};
yList = {:Age, :Oxy};
// 4 Here
どちらの方法で値をアンロードしても、yList変数とeffectList変数を分析で使用できます。
fm = dt << Fit Model(
Y( Eval( yList ) ),
Effects( Eval( effectList ) ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run
);
では、Column Dialog() を使用する際の主な考慮事項は何でしょうか?
- 現在のデータテーブルから列を選択する列セレクターは常に表示されます。これはユーザーに列を選択させたい場合に便利ですが、このタイプのモーダルウィンドウの使用を制限する要因にもなります。
- 記述する必要のあるスクリプトコードの量はかなり少ないです。組み込み機能でニーズを完全に満たせる場合もあるでしょう。ただし、カスタマイズの自由度は限られています。例えば、ウィンドウ内の表示ボックスの配置を制御するコンストラクタは、HList()、VList()、Line Up Box() の3つしかありません。
- ColumnDialog() から返される値は一貫しています。スクリプト作成者であれば、ColumnDialog() が必ず抽出する必要のある値のリストを返すことをご存知でしょう。欠点は、値をアンロードする追加の手順が必要になることと、ユーザーの選択を取得する方法に関して柔軟性が低いことです。
Column Dialog() で使用できるコンストラクタの完全なリストについては、 スクリプトガイドの「表示ツリー」章の「Column Dialog のコンストラクタ」セクションを参照してください。
新しいウィンドウ()
NewWindow() は、モーダルウィンドウまたは非モーダルウィンドウを生成できる組み込み関数です。このウィンドウは、ユーザーに列の選択を促すことから、重要な情報をユーザーに通知することまで、あらゆる用途に使用できます。利用可能な表示ボックスの種類と数のおかげで、NewWindow() を使用して非常にカスタマイズされたモーダルウィンドウを作成できます。
カスタマイズオプションが増えるにつれて、記述するコード量も増えます。次の例は、上記の Column Dialog() と同様のウィンドウを示しています。表示ボックスの中には、似たような名前のものがあることに注目してください。たとえば、V List Box()、H List Box()、Panel Box()、Lineup Box() は、ウィンドウのレイアウトを制御するために使用されます。残りの表示ボックスは、ボタンや列のリストなど、ウィンドウに表示される要素です。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
nw = New Window( "Launch Dialog",
<
<MODAL>
V List Box( Align( "right" ),
<STRONG>H List Box</STRONG>(
<STRONG>Panel Box</STRONG>( "Select Columns", clb = Filter Col Selector( dt, all ) ),
<STRONG>Panel Box</STRONG>( "Cast Selected Columns into Fit Model Roles",
<STRONG>Lineup Box</STRONG>( N Col( 2 ), Spacing( 5 ), Button Box( "Y", clbY << Append( clb << Get Selected ) ), clbY = Col List Box( "Numeric", MinItems( 2 ), MaxItems( 2 ), nlines( 3 ) ), Button Box( "Effects", clbEffects << Append( clb << Get Selected ) ), clbEffects = Col List Box( "Numeric", MinItems( 2 ), MaxItems( 3 ), nlines( 4 ) ), Button Box( "Remove", clbY << Remove Selected; clbEffects << Remove Selected; ) ) ) ),
<STRONG>H List Box</STRONG>( Button Box( "OK", yVars = clby << Get Items( "Column Reference" ); eVars = clbEffects << Get Items( "Column Reference" ); ), Button Box( "Cancel" ) ) ) );
</MODAL>
ユーザーに表示されるウィンドウは次のようになります。

このサンプルウィンドウのスクリプトでは、選択された列がOKボタンのJSL変数に割り当てられています。Yボタンとエフェクトボタンのスクリプトでも列を割り当てることができるのではないかと思われるかもしれません。確かにその通りです。しかし、ユーザーが列をColリストボックスにドラッグアンドドロップできるため、これらのボタンは実際にはクリックされない可能性があります。したがって、ボタンのスクリプトは実行されません。別の方法については、作成ガイドの「表示用樹木」章の「ウィンドウから値を抽出する」セクションを参照してください。
見せる ( yVars, eVars );を実行すると、ログ (表示 > ログ) に値が一覧表示されます。
yVars = {:Age, :Oxy};
eVars = {:RunPulse, :RstPulse};
これらの変数は、アンロードすることなくフィットモデルの起動時に使用できます。
fm = dt << Fit Model(
Y( Eval( yVars ) ),
Effects( Eval( eVars ) ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run
);
スクリプトコードの多さに圧倒されないでください。代わりに、このモーダルウィンドウ(New Window())で利用できるカスタマイズオプションをいくつか見ていきましょう。以下の項目は、上の画像に表示されている番号に対応しています。
- New Window() 関数を使用すると、スクリプトプロジェクトに適したウィンドウタイトルを指定できます。この例では、「ダイアログの起動」というシンプルなタイトルを使用しています。
- グループ分けの上に表示されるテキストはカスタマイズ可能です。これにより、ユーザー向けにグループ分けに関する簡単な説明や指示を提供できます。
- 選択した列を保持する Col List Box() のオプション引数として、表示する行数を指定できます。これにより、表示ボックスに表示される列数を制御できます。また、上記のように、見た目を整えるために余白を追加することも可能です。
- 列リストは、現在開いているテーブルだけでなく、任意の開いているデータテーブルから取得できます。なお、NewWindow() 関数はさまざまなダイアログメッセージに使用できるため、列リストの表示は任意です。
- OKボタンにはカスタム機能を設定できます。また、キャンセルボタンはオプションです。
New Window() has many more constructors available than were demonstrated here, such as sliders, radio buttons, pictures, graphs, and more! For a list of constructors available for New Window(), review the Construct Display Boxes for New Windows section of the 展示用樹木 chapter in the スクリプト作成ガイド.
要約すると、Column Dialog() はウィンドウを素早く簡単に作成できる方法ですが、カスタマイズのサポートは限られています。一方、モーダル New Window() はカスタマイズの柔軟性が非常に高いものの、作成にはより多くの検討とスクリプトが必要になります。どちらのオプションにも大きな利点があり、それぞれに使い道があるでしょう。幸いなことに、どちらもツールボックスに入れておくことができます。