スコープ演算子は、名前が曖昧な場合(たとえば、変数と列名の両方を指している場合)の解決の助けとなります。
次の例では、接頭部の二重コロン(::)により、zがグローバル変数であることを示しています。接頭部の一重コロン(:)は、xとyが列名であることを示します。
::z = :x + :y;
ヒント: Names Default to Here(1)関数も名前の解決に影響を与えます。Names Default To Hereとグローバル変数を参照してください。
スコープ演算子と同様に使用できるJSL関数が2つあります。表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.jslとB.jslの間にある共有名は、グローバルと名前空間のみです(hereでもlocalでもない)。
A.jslの名前をB.jslに適用するには、B.jslをA.jslにインクルードすれば、両方のスクリプトを開いて実行する必要がありません。
Include( "$MY_SCRIPTS/B.jsl" );