スクリプトガイド > 表示ツリー > JMPレポートの操作 > ディスプレイボックスにメッセージを送る
公開日: 11/25/2021

ディスプレイボックスにメッセージを送る

ティスプレイボックスの参照に対して、Sendまたは<<演算子によって、そのディスプレイボックスにメッセージを送れます。たとえば、out2がアウトラインノードの参照である場合、開いているときは閉じるよう、out2自体に要求することができます。

out2 << Close(); // アウトラインノードを閉じる

Close()は、赤い三角ボタンのメニューで項目を選択する場合と同様、アウトラインノードの開閉を交互に切り替えます。「閉じるまたは閉じたまま」にするには1、「開くまたは開いたまま」にするには0を指定します。

rbiv["平均のあてはめ"] << Close;  // 開閉を交互に切り替える
rbiv["平均のあてはめ"] << Close( 1 ); // 閉じるまたは閉じたままにする
rbiv["平均のあてはめ"] << Close( 0 ); // 開くまたは開いたままにする

ヒント:[一般]環境設定の[無効なディスプレイボックスメッセージを報告]オプションは、無効なディスプレイボックスメッセージを特定するのに役立ちます。

このオプションは、デフォルトではオフになっています。ディスプレイボックスが無効なメッセージを受け取ると、JMPは、エラーを無視し、スクリプトの実行を継続します。

この環境設定がオンの場合、ログにエラーが表示されます。

このオプションは、スクリプトの開発中は役立ちますが、実際に使用するにあたっては、無効なメッセージが使われたかどうかは不要な情報であることが多いです。

<<演算子

send(<<)演算子を使ってディスプレイボックスにメッセージを送ることができます。この演算子を使うと、指定されているものが、それに含まれる子オブジェクトなのか、それともオプションなのかを明確に区別することができます。また、グラフ内において、どれがオプションで、どれが実行されるスクリプトであるのかも明確にできます。

次の例では、グラフボックスにメッセージを送ります。

win = New Window( "メッセージ",
	gb = Graph Box(
		Frame Size( 400, 400 ),
		X Scale( 0, 25 ),
		Y Scale( 0, 25 )
	)
);
gb << Background Color( "red" );

入れ子と優先順位

複数のメッセージを同時に指定した場合(つまり、入れ子で複数のメッセージを指定した場合)と、左から右へとメッセージが評価されていきます。

次の式は、message1boxへ、次にmessage2boxへ、最後にmessage3boxへ送ります。次のメッセージが送られる時点で、前のメッセージによりboxが変更されている可能性があります。

box << message1 << message2 << message3;

次の式は、message1boxへ送り、結果を取得します。その結果にmessage2が送られ、message2の結果にmessage3が送られます。

( (box << message1) << message2) << message3

次の式では、message3の結果が変数xに割り当てられます。

x = box << message1 << message2 << message3;

次に、入れ子にしたメッセージを使った例を紹介します。

win = New Window( "メッセージ", gb = Graph Box() );
 

// message 1は背景色を設定する

sz = gb << Background Color( "red" )
 

// message 2はグラフボックスをPNGファイルとして保存する

<<Save Picture( "$DOCUMENTS/red.png", "png" )
 

// message 3はグラフボックスの背景色を白に設定する

<<Background Color( "white" )
 

// message 4はグラフボックスのサイズを戻し、ログに出力する

<<Get Size();

複数のメッセージを入れ子にする場合は、スクリプトが意図したとおりに実行されるように、括弧を使ってメッセージをグループ化したほうがいいでしょう。

Send To Report関数とDispatch関数を使ってレポートをカスタマイズする

Send To Report()Dispatch()の各関数は、ディスプレイボックスの変更内容を分析スクリプトの中に記録したい時に用います。これら2つの関数においてそれらの引数に指定することで、たとえば、アウトラインノードの開閉、グラフフレームのサイズ変更、グラフフレーム内の色のカスタマイズなどを実行できます。それらの引数の指定においては、JSLステートメントで指定することもできます。

Send To Report()は、表示ツリーを変更するオプションのリストを含みます。

Dispatch()は、表示ツリーを変更する4つの引数を含みます。

第1引数は、表示ツリーの目的の部分を見つけるために通過する必要があるアウトラインノードのリストです。

第2引数と第3引数はペアで機能します。第2引数はディスプレイボックスの名前、第3引数はディスプレイボックスの種類です。これら2つの引数で、カスタマイズの対象とする表示ツリーの特定のディスプレイボックスを指定します。

第4引数はオプションのリストです。

たとえば、Big Class.jmpを開き、そこに保存されている「二変量の関係(二変量)」スクリプトを実行したとします。これにより、回帰直線のレポートが生成されます。次に、「あてはまりの悪さ(LOF)」アウトラインノードを開き、「分散分析」アウトラインノードを閉じたとします。この後、[スクリプトの保存]>[スクリプトウィンドウへ]を選択してください。スクリプトエディタウィンドウに次のスクリプトが表示されます。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = dt << Bivariate(
	Y( :weight ),
	X( :height ),
	Fit Line(),
	SendToReport(
		Dispatch(
			{"Linear Fit"},
			"Lack Of Fit",
			OutlineBox,
			{Close( 0 )} ),
		Dispatch(
			{"Linear Fit"},
			"Analysis of Variance",
			OutlineBox,
			{Close( 1 )}
		)
	)
);

Send To Report()関数は、デフォルトのレポートをカスタマイズする2つのDispatch()関数を含みます。

最初の引数は、「Linear Fit」(直線のあてはめ)という名前のアウトラインノードを見つけます。

第2、第3の引数は、「Linear Fit」(直線のあてはめ)アウトラインの下にある「Lack of Fit」(あてはまりの悪さ(LOF))という名前のアウトラインボックスを見つけます。

第4引数は、このアウトラインボックスに送る引数です。この例では、メッセージはClose(0)、つまりノードを開くコマンドです。

メモ: 同じ名前のアウトラインノードが複数ある場合は、添え字が割り当てられます。たとえば、「二変量の関係」の分析に2つの「2次のあてはめ」がある場合(同じタイトルになる)、2番目の「2次のあてはめ」にコマンドを適用すると、重複するタイトルに添え字[2]が追加されたDispatchコマンドが生成されます。

Send to Report()Dispatch()を効果的に使用するには、まず、対話式にレポートをカスタマイズします。そして、そのレポートをスクリプトとして保存し、JMPによって生成されたそのスクリプトを確認します。JMP自身が、実は最高のJSLプログラマーなのです。

ジャーナルを作成する

「ジャーナル」として保存することで、ある時点におけるJMPウィンドウの内容をそのまま保存することができます。JMPウィンドウにグラフが表示され、チェックボックスの一部がオンになっているとしましょう。そこからジャーナルを作成すると、ジャーナルには、そのグラフと、その時点でオンになっていたチェックボックスが表示されます。

次の例で、ジャーナルを使ってどのようなことができるかを示します。

「二変量」レポートから始めてみましょう。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = dt << Bivariate( Y( :"体重(ポンド)"n), X( :"身長(インチ)"n));
rbiv = biv << Report;

結果をジャーナルにまとめます。

rbiv << Journal Window;

次のように指定し、ジャーナルをファイルに保存します。

rbiv << Save Journal(
	"$DOCUMENTS/test.jrn"
);

上の例では、macOSのファイルパス規則を使用しています。Windowsでは、スラッシュ(全プラットフォームに有効)または英語環境ではバックスラッシュ(日本語環境では円マーク、Windowsのみに有効)を使用します。

スクリプトにBy変数を使用した場合、各Byグループの分析結果への参照が含まれたリストが戻り値になります。すべてのByグループのレポートをジャーナルにまとめるには、parentメッセージを使用してレポートの先頭に移動する必要があります。

たとえば、次のスクリプトは、Byグループを使用した二変量のレポートを作成し、レポート全体のジャーナルを作成します。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = dt << Bivariate(
	Y( :"体重(ポンド)"n ),
	X( :"身長(インチ)"n ),
	By( :性別 )
);
( ( Report( biv[1] ) << Parent ) << Parent ) <<
Save Journal( "test.jrn" );

グリッド線を持つグラフのジャーナル

グラフの軸を非表示(Collapse)にしている場合、レポートをジャーナルにしたり、貼り付けたり、またはPDFファイルとして保存した場合、グリッド線が表示されなくなります。グラフにグリッド線が表示されるようにするには、レポートをJMPで画像ファイルとして保存するか、Microsoft PowerPointプレゼンテーションとして保存してください。

よく使用されるメッセージ

数値列を更新する

数値列ボックスを更新するには、Set Valuesメッセージを使います。数値列ボックスは、表(テーブルボックス)のなかでよく使われます。

win = New Window( "数値列",
	num = Number Col Box( "値", [9, 10, 11] )
);
num << Set Values( [1, 2, 3] );

行列の引数が、テーブルの新しい数値を指定しています。

数値列に桁区切りを追加する

数値列ボックスに桁区切りを追加するには、Set Formatメッセージを使用します。

New Window( "例",
	ncb = Number Col Box( "乱数",
		{Random Uniform(), Random Uniform() * 10,
		Random Uniform() * 100, Random Uniform() * 1000,
		Random Uniform() * 10000}
	)
);
ncb << Set Format(10.3, "Fixed Dec", "Use thousands separator");

文字列の列を更新する

文字列の列ボックスを更新するには、Set Valuesメッセージを使います。

win = New Window( "文字列",
	str = String Col Box( "値", {"a", "b", "c"} )
);
str << Set Values( {"A", "B", "C"} );

引数に指定しているリストが、新しい文字列を指定しています。

テキストを折り返す

通常、Text Box()内ではテキストは自動的に改行されます。ただし、Set Wrap (n)メッセージを使うと、デフォルトの改行ポイントを上書きすることができます。次のスクリプトは、200ピクセルの地点でテキストを折り返します。

win = New Window( "テキストの折り返し幅",
	tb = Text Box(
		"データ点にカーソルを置くと情報が表示されます。"
	)
);
tb << Set Wrap( 200 );

テキストボックスを箇条書きにする

箇条書きにするには、Bullet Point(1)メッセージを使います。

win = New Window( "箇条書きのリスト",
	text1 = Text Box( "データ点にカーソルを置くと情報が表示されます。" ),
	text2 = Text Box( "統計量を円で囲むと情報が表示されます。" )
);
text1 << Bullet Point( 1 );
text2 << Bullet Point( 1 );

Bullet Point( 1 )メッセージをテキストボックスに送ると、テキストの前に中黒が挿入され、テキストボックス内の後続の行はインデントされます。

Bullet Point( 1 )メッセージは、次の例のようにインラインで指定することもできます。

text1 = Text Box( "データ点にカーソルを置くと情報が表示されます。" ), << Bullet Point( 1 ) ),

選択されたディスプレイボックスを反転表示する

SelectReshow、およびDeselectを使うと、ディスプレイボックス上で選択を示す強調表示を点滅させたり解除させたりすることができます。前述のように、複数の<<節を一緒に並べて、1つのオブジェクトに複数のメッセージを1行で送ることができます。結果は左から右に読んでいきます。たとえば、次の例の場合、まず、Selectが処理され、次にReshow、その次にDeselect、その次にもう一つのReshowが処理されます。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = dt << Bivariate(
	Y( :"体重(ポンド)"n ),
	X( :height ),
	Fit Mean( )
);
 

// 二変量の分析レイヤーをrbivに割り当てる

rbiv = biv << Report;
 

/* rbivレポート内で指定の文字列を含む

アウトラインボックスを見つけ、それをout2変数に割り当てる */

out2 = rbiv[Outline Box( "平均?" )];
out2 << Close( 0 ); // アウトラインボックスを開く
 

/* rbivの最初の文字列ボックスを見つけ、

scbx 変数に割り当てる */

scbx = rbiv[String Col Box( 1 )];
 
Wait( .25 ); // 0.25秒待機する
For( i = 0, i < 20, i++, // iを0に設定し、20回ループする
 

/* 文字列ボックスを選択して再表示し、

選択を解除して再表示する*/

	scbx << Select << Reshow << Deselect << Reshow
);

テーブルの見出しに網掛けや枠線を追加する

見出しは、デフォルトで網掛けと枠線がついています。これらをオフにするには、Set Shade Headings ( 0 )メッセージとSet Heading Column Borders ( 0 )メッセージを使用します。次の例は、網掛けと枠線をそれぞれオンからオフにしたときの違いを示しています。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize(
	meanHt = Mean( "身長(インチ)"n),
	minHt = Min( "身長(インチ)"n ),
	maxHt = Max( "身長(インチ)"n ),
);
win = New Window( "要約の結果",
	tb = Table Box(
		Number Col Box( "平均", meanHt ),
		Number Col Box( "最小値", minHt ),
		Number Col Box( "最大値", maxHt )
	)
);
Wait( 2 );
tb << Set Shade Headings( 0 );
Wait( 1 );
tb << Set Heading Column Borders( 0 );
Wait( 2 );
tb << Set Shade Headings( 1 );
Wait( 1 );
より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).