公開日: 04/01/2021

スコープ演算子

スコープ演算子は、名前が曖昧な場合(たとえば、変数と列名の両方を指している場合)の解決の助けとなります。

次の例では、接頭部の二重コロン(::)により、zがグローバル変数であることを示しています。接頭部の一重コロン(:)は、xyが列名であることを示します。

::z = :x + :y;

ヒント: Names Default to Here(1)関数も名前の解決に影響を与えます。Names Default To Hereとグローバル変数を参照してください。

スコープ演算子と同様に使用できるJSL関数が2つあります。表5.4は、その関数と構文を示したものです。

表5.4 スコープ演算子

演算子と等価の関数

関数構文

説明

:

As Column

:name

dt :name

As Column(dt, name)

nameをデータテーブル列として評価させる。オプションのデータテーブル参照引数dtは、現在のデータテーブルを設定します。例については、適用範囲が指定された列名を参照。

::

As Global

::name

As Global(name)

nameをグローバル変数として評価させる。

二重コロンは、範囲を表す二項演算子としても使われることに注意。

適用範囲が指定された列名

列名の適用範囲を指定すれば、変数名の競合を簡単に回避できます。スコープ演算子を使い、スクリプト内の名前を列への参照として評価させます。

1. 接頭部のコロン(:)は、名前がグローバル変数ではなく、テーブル列またはテーブル変数を参照することを意味します。接頭部のコロンは、現在のデータテーブルの内容を参照します。

:年齢;

2. 二項演算子のコロン(:)は、この考え方を拡張して、データテーブル参照を使って、どのデータテーブルの列なのかを指定します。これは、スクリプト内で複数のデータテーブルが参照されている場合に特に重要です。

次の例では、dt変数が「Big Class.jmp」へのデータテーブル参照を設定します。二項演算子のコロンは、データテーブル参照と「年齢」列を分離します。

dt = Data Table( "Big Class.jmp" );
dt:年齢 // コロンは二項演算子。

As Column()の場合も同じ結果となります:

dt = Data Table( "Big Class.jmp" );
As Column( dt, 年齢 );

したがって、「Big Class.jmp」が開いている場合に限り、次の式も等価です。

:年齢;
As Column( dt, 年齢 );
dt:年齢;

Column関数は列を特定する目的で使用することもできます。「Big Class.jmp」では、以下の式はすべてテーブル内の2番目の列である「年齢」を参照します。

Column( "年齢" );
Column( 2 );
Column( dt, 2 );
Column( dt, "年齢" );

列名と変数名の競合を回避する

競合を避けるため、一意な列名や変数名を使用するか、名前の適用範囲(スコープ)を指定してください。

グローバル変数と列の名前が同じ場合は、グローバル変数の名前が優先します。そのため、列名の方の適用範囲(スコープ)を指定する必要があります。

::年齢 = [];
年齢 = :年齢 << Get As Matrix;

グローバル変数と列名の混同を避けるには、両方の変数の適用範囲を指定してください。

::年齢 = :年齢 << Get As Matrix;

複数のデータテーブルが開いている可能性がある場合は、データテーブル参照を変数に割り当てます。
適切なテーブルを列の適用範囲として指定します。

dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/Students.jmp" );
::年齢 = dt1:年齢 << Get As Matrix;
::Name(" 身長( インチ)") = dt2:身長 << Get As Matrix;

JMPは、列にある連続したセルすべてについて列計算式を評価します。そのため、通常は列名の適用範囲を指定する必要はありません。ただし、計算式内に割り当てられた変数が列と同名の場合、その列名の適用範囲を指定する必要があります。適用範囲が指定された名前を参照してください。

ヒント: Names Default to Here(1)関数も名前の解決に影響を与えます。Names Default To Hereとグローバル変数を参照してください。

適用範囲が指定されていない列名

適用範囲が指定されていない名前に対して値を設定したり、値を取得する場合があります。次のような場合、JMPは名前を(グローバル変数ではなく)データテーブル内の列として解決します。

その名前をすでに使用しているグローバル変数、ローカル変数、または引数が存在しない

かつ、コンテキスト内のデータテーブルに同名の列がある

かつ、次のどちらかである

現在の行の番号が正の値に設定されている

名前に添え字がある(たとえば、:Name("体重(ポンド)")[1]の添え字[1]は、「体重(ポンド)」列の最初の値を選択する)

例外

列計算式と非線形回帰の計算式では、列名がグローバル変数よりも優先します。

現在のデータテーブル行の設定

デフォルトでは、現在の行の番号は0で、これは無効な数値です。そのため、次の式はグローバル変数ratioに欠測値を割り当てます。

ratio = :Name("身長(インチ)") / :Name("体重(ポンド)");

Row()関数を使って行番号を指定します。次の例は、行を3に設定します。その行の身長を体重で割り、その結果をグローバル変数ratioに割り当てます。

Row() = 3;
ratio = :Name("身長(インチ)") / :Name("体重(ポンド)");

別の方法としては、添え字を使って行番号を指定する方法があります。次の式は、行3の身長を行4の体重で割ります。

ratio = :Name("身長(インチ)")[3] / :Name("体重(ポンド)")[4];

スクリプトがデータテーブルの各行に対して実行される場合、行番号の指定は必要ありません。次の例は、「比率」列を作成します。各行の身長を体重で割っています。

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "比率" );
For Each Row( :比率 = :Name("身長(インチ)") / :Name("体重(ポンド)") );

JMPは計算式を評価し、列全体にわたって反復して事前評価された統計量を計算します。このような場合も、行番号の指定は必要ありません。(事前計算された統計量は、事前計算される統計量で説明するように、データテーブルから計算される単一の数値です。)

自動実行されるスクリプトでの名前解決

Open()関数では、スクリプトを開いた時点で自動的に実行するよう指定できます。

Open( "$MY_SCRIPTS/A.jsl", Run JSL( 1 ) );
Open( "$MY_SCRIPTS/B.jsl", Run JSL( 1 ) );

また、スクリプトの最初の行に「//!」と入力して自動実行することもできます。

これらのインスタンスでA.jslB.jslの間にある共有名は、グローバルと名前空間のみです(hereでもlocalでもない)。

A.jslの名前をB.jslに適用するには、B.jslA.jslにインクルードすれば、両方のスクリプトを開いて実行する必要がありません。

Include( "$MY_SCRIPTS/B.jsl" );
より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).