このバージョンのヘルプはこれ以降更新されません。最新のヘルプは https://www.jmp.com/support/help/ja/15.2   からご覧いただけます。


式とは、評価可能な演算子によってつながれた変数、定数、および関数の任意の組み合わせです。「JSLの構成要素」章の「名前解決のルール」(94ページ)の節では、JMPがどのように式を評価するかについて説明しています。ここでは、いつJMPが式を評価するかについて学習します。JMPはステートメントを順番に評価します。式を使用して、式を割り当て、必要に応じてその式を修正または実行することができます。
いつ式を評価するかを制御する演算子は、ExprEvalです。これらは、評価を遅延させる演算子と評価を促す演算子とみなすことができます。Exprは、引数を評価するのではなく、式としてそのままコピーします。Evalはその反対の処理をします。つまり、引数の値を求めてから、その結果を使って式全体を評価します。
ExprEvalは、JMPに対していつ式として認識し、いつ式の評価結果を戻すかを指示する、クォート演算子と非クォート演算子とみなすことができます。
x = 1; y = 20;
Exprを使ってx+yを式として囲み、この式をaに割り当てた場合、aが評価されるときは、xyの現在の値を使って式を計算し、結果を戻します。(例外として、ShowWrite、およびPrintのユーティリティがあります。これらは、引数として名前だけを指定した場合、その名前に割り当てられている式を評価しません。)
x = 1; y = 20;
a = Expr( x + y );
a;
x = 1; y = 20;
Show( Name Expr( a ) );
式のクォートを入れ子にした場合、aが評価されるときに1階層だけが評価され、結果は式x+yになります。
x = 1; y = 20;
a = Expr( Expr( x + y ) );
Show( a );
式の値を求めるときは、Evalを使ってすべての層の式を評価します。
x = 1; y = 20;
Show( Eval( a ) );
x = 1; y = 20;
a = Expr( Expr( Expr( Expr( x + y ) ) ) );
b = a;
c = Eval( a );
d = Eval( Eval( a ) );
e = Eval( Eval( Eval( a ) ) );
JSL Quote()関数は、式の内容を、引用符で囲んだ文字列として戻します。文字列内のコメントと空白はそのまま維持されます。ログウィンドウでも構文の色分けが適用されます。
x = JSL Quote( /* クォートの開始 */
For (i = 1, i <= 5, i++,
	// iの値を出力
Print( i );
);
	// 式の終わり
);
Show( x );
出力では、JSL Quote()関数の内容が引用符で囲まれます。
x = " /* クォートの開始 */
// iの値を出力
// 式の終わり
Expr()関数の一般的な使い方は、スクリプトをグローバル変数に格納することです。これをマクロのようなものと考えることもできます。次のスクリプトを見てみましょう。
dist = Expr( Distribution( Column( :Name("身長(インチ)") ) ) );
dist;
For( i = 0, i < 3, i = i + 1, dist );
式の評価を明示的に指定するには、Eval()を使用してください。
Eval( dist );
ただし、列計算式における列に対しては、eval()は思い通りに動作しないことに注意してください。たとえば、
Formula( Log( Eval( Column Name( i ) ) ) );
Formula( Eval( Substitute( Expr( Log( xxx ) ), Expr( xxx ), Column Name( i ) ) ) );
Formula( Eval( Column Name( i ) ) + 10 );
Formula(Eval(Substitute(Expr(xxx+10), Expr(xxx), column name(i))))
グローバル変数を評価(実際にプラットフォームを起動)するのではなく、グローバル変数に保存されている式(上の例のdistに格納されている式Distribution(Column(:Name("身長(インチ)")))など)が必要な場合は、どうするのでしょうか。そのときは、Name Expr関数を使います。Name Exprは引数を評価しないで式として取り出します。ただし、引数がひとつの変数名だけの場合は、その変数に保存された式を、評価されていない状態で取り出します。
Exprが引数そのものを戻すのに対して、Name Exprは引数に保存されている式を検索します。Name Exprは式を得るために一番上の層だけを「開封」するのであり、すべての階層を開封するのではありません。
popVar = Expr( Summation( i = 1, N Row(), (y[i] - Col Mean( y )) ^ 2 / N Row() ) );
 
unbiasedPopVar = Substitute( Name Expr( popVar ), Expr( Wild()/N Row() ), Expr( (y[i] - Col Mean( y )) ^ 2 / ( N Row() - 1 ) ) );
次のスクリプトを実行してから、xExpr(x)NameExpr(x)、およびEval(x)を比較してみます。
a = 1; b = 2; c = 3;
x = Expr( a + b + c );
x;
xa+b+cと評価し、さらにその式を評価して結果の6を戻す(外側の2つの層を開封する)。
Eval( x );
単にxを呼び出しているのと同じ。
xa+b+cと評価し、さらにその式を評価して結果の6を戻す(外側の2つの層を開封する)。
NameExpr( x );
xに格納されていた式a+b+cを戻す(1番外の層を開封する)。
Expr( x );
xを戻す(1つの層に封入する)。
NArg(expressionArg)は、expressionArgの中の引数の数を調べます。
expressionArgは、式を含む変数の名前、評価結果が式になるような式、またはExpr()で囲まれた式のいずれかです。
NArg (name)は、nameから式(評価されていない状態)を取り出し、引数の数を戻します。
NArg (expression)は、expressionを評価し、引数の数を戻します。
NArg (Expr(expression))は、式expressionの引数の数を戻します。
たとえば、aExpr = {a+b,c,d,e+f+g};の場合
NArg(Expr({1,2,3,4}))4となります。
Head(expressionArg)は、演算子を使わないで表した式の先頭の関数(引数なし)を戻します。式が特殊文字の二項演算子、接頭演算子、接尾演算子であるときは、それらと等価な関数が戻されます。
expressionArgは、式を含む変数の名前、評価結果が式になるような式、またはExpr()で囲まれた式のいずれかです。
たとえば、aExpr = expr(a+b);の場合
r = Head({1,2,3}){}となります。
Arg(expressionArg,indexArg)は、式の中から指定の引数を抽出し、式として戻します。
Arg(expressionArg,i) expressionArgi番目の引数を抽出します。
expressionArgは、式を含む変数の名前、評価結果が式になるような式、またはExpr()で囲まれた式のいずれかです。
Arg(name,i)は、nameに含まれた式(評価されていない状態)を取得し、i番目の引数を検索します。
Arg(expression,i)は、expressionを評価し、i番目の引数を検索します。
Arg(Expr(expression),i)は、expressionのi番目の引数を検索します。
別の例としてaExpr = Expr(12+13*sqrt(14-15));の場合を示します。
Arg(aExpr,2)13*sqrt(14-15)
Arg(Arg(aExpr,2),1)は、aExprの第2引数の中の最初の引数、つまり13を戻します。
Arg(Arg(aExpr,2),2)Sqrt( 14 - 15 )
1.
内側のArgステートメントが評価されます。
Arg(aExpr,2)
Arg(Arg(aExpr,2),2)
// これはArg(Expr(13 * Sqrt( 14 - 15 ) ), 2)と等価
Arg(Arg(Arg(aExpr,2),2),3)
// これはArg (Expr(Sqrt( 14 - 15 ) ), 3)と等価
Sqrt式の要素は1つだけなので、第3引数への要求に対してEmpty()が戻されます。Sqrt式内の2つの引数にアクセスするには、次のようにします。
Arg(Arg(Arg(Arg(aExpr,2),2),1),2);
HeadName(expressionArg)は、式の先頭の関数の名前を文字列として戻します。式が特殊文字の二項演算子、接頭演算子、接尾演算子であるときは、それらと等価な関数の名前が戻されます。
expressionArgは、式を含む変数の名前、評価結果が式になるような式、またはExpr()で囲まれた式のいずれかです。
たとえば、aExpr = expr(a+b);の場合
r = HeadName ({1,2,3})"List"となります。
JMPのこれまでのバージョンでは、ArgNargHead、およびHeadNameがそれぞれArgExprNArgExprHeadExpr、およびHeadNameExprとして実装されていました。基本的に働きは同じでしたが、引数の評価を行わない点が異なります。旧バージョンの形式は、今後のマニュアルには記載されなくなる予定です。
Eval Insertでは、文字列の中に含まれる式を評価することによって、文字列の部分置換を行えます。
Eval Insertでは、式の前後の文字を指定すると、その間の式が評価、展開されます。
resultString = EvalInsert(式が埋め込まれた文字列,開始区切り文字,終了区切り文字)
EvalInsertInto(式が埋め込まれた文字列を持つ変数,開始区切り文字,終了区切り文字)
区切り文字の指定はオプションです。デフォルトの開始文字は"^"、 デフォルトの終了文字は、開始文字と同じ文字です。
xstring = "def";
r = Eval Insert( "abc^xstring^ghi" );  // 戻り値が"abcdefghi";になる
 
r = "abc^xstring^ghi"; // 値を置き換え
Eval Insert Into( r ); // rが"abcdefghi";になる
 
// 区切り文字の指定
r = Eval Insert( "abc%xstring%ghi","%" );  // 戻り値が"abcdefghi";になる
 
// 開始値と終了値が異なる例
r = Eval Insert( "abc[xstring]ghi","[","]" );  // 戻り値が"abcdefghi";になる
数値にロケール固有の表示形式が含まれている場合は、<<Use Locale(1)オプションを含めます。次の例は、小数点の代わりにカンマを使用するロケール環境で実行したものです。
Eval Insert( "^1.2^", <<Use Locale( 1 ) );
Eval Listは、リスト内の式を評価し、その結果をリストにして戻します。
x = { 1 + 2, 3 + 4 };
y = Eval List( x );   // yは{3,7}になる
Eval Listは、Column Dialogまたは引数Modalを使用したNew Windowから戻された、ユーザの選択によるリストをロードするのに便利です。
Eval Expr()は、内側の式だけを評価し、その結果を含む式を戻します。これと比較して、Evalは内側の式を評価し、結果を用いて式をさらに評価します。
データテーブルにX3という名前の列があるとしましょう。ここで、Eval Expr()を使って内側の式を最初に評価する例を紹介します。
x = Expr( Distribution( Column( Expr("X"||Char( i ) ) ) ) );
i = 3;
y = Eval Expr( x );   // Distribution( Column( "X3" ) )を戻す
結果をさらに評価するには、その後のステップで結果を呼び出すか、Eval Expr()Eval()で囲む必要があります。以下の例では、「一変量の分布」レポートを作成します。
// 2つのステップを取る方法
x = Expr( Distribution( Column( Expr( "X" || Char( i ) ) ) ) );
i = 3;
y = Eval Expr( x );
y;
 
// 1つのステップで済む方法
x = Expr( Distribution( Column( Expr( "X" || Char( i ) ) ) ) );
i = 3;
Eval( Eval Expr( x ) );
最初にEval Exprを実行せずに、直接xEvalを使おうとした場合にどのようなことが起こるかについては、評価を制御する関数を参照してください。
x = Parse( "a=1" ) ;  // 現在xには式a=1が入っている
Eval( Parse( "a=1" ) ); // 現在aには値1が入っている
この逆をするには、式を文字列に変換するChar関数を使います。通常、Charは引数を評価してから文字列に変換するため、Char関数の引数をExpr関数(または変数のNameExpr関数)にします。
y = Char( Expr( a = 1 ) ); // yは「a=1」という文字値になる
z = Char( 42 ); // "42"になる
引数が数値の場合、Char関数では、フィールド幅と小数桁数の引数を指定できます。デフォルトでは、フィールド幅は18で、小数桁数は99です([最適]の形式)。
Char( 42, 5, 2 ); // 文字値は"42,00"になる
Char( 42, 5, 2, <<Use Locale(1) ); // フランスのロケールで実行した場合、"42,00"になる
Charの逆は、それほど簡単ではありません。文字列を式に変換するときはParseを使いますが、文字列を数値に変換するときはNumを使います。
Parse( y );
Num( z );
Char(Expr(expression))
Char(name)
expression(式)を文字列に変換する。式はExprで囲む必要があります。囲まない場合、その評価結果が文字列に変換されます。
string = char(number, width, decimal)
number(数値)を文字値に変換する。widthdecimalは、形式を指定するためのオプションの引数です。デフォルトでは、width(フィールド幅)は18で、decimal(小数桁数)は99です。
xを評価し、次いでxの結果を評価する(非クォート)。
xの中の式すべてを評価して、式を戻す。
リスト(list)内の式を評価した後のリストを戻す。
xに格納されている式を評価せずに戻す。NameExprは、xが1つの変数名の場合、名前xを評価せずに戻すのではなく、その変数xに保存されている式を評価せずに戻します。その点を除けば、NameExprExprと同じです。
Num("string")
Parse("string")
評価を制御する関数では、xを使った評価制御関数のさまざまな使い方を比較しています。データテーブルにX3という名前の列があり、xiが割り当てられているとしましょう。
x = Expr( Distribution(Column( Expr("X"||Char( i ) ) ) ) );
i = 3;
x; // または
見つかりません。 'distribution'へのアクセスまたは評価 , 不正な引数( {"X" || Char( i )} ), distribution( Column( Expr( "X" || Char( i ) ) ) )
Eval(x)xの呼び出しは同じ。
distribution( column( expr( "X" || Char( i ) ) ) )を評価します。結果はエラーとなります。列名は、Expr()関数によって囲まれているため、"X"||Char(i)のように認識されます。
xを戻す(追加の層によりxを包みこむ)。
xに保存されている式Distribution(Column(Expr("X" || Char(i))))をそのまま戻す。
y; // または
Eval(eval expr(x))yの呼び出しは同じ。
Distribution(Column("X3"))を評価し、プラットフォームを起動します。
式全体を文字列としてクォートする。必要に応じて、¥!"というエスケープ文字を追加します。
Char(x)と指定すると、最初にxを評価しようとしてエラーが発生するため、欠測値を引用符で囲んだ"."が戻されることに注意してください。
この例は、少なくともこれを2つのステップに分解する必要があることに注意してください。これを1つの大きなステップに組み合わせると、Eval Expr関数が、Parse層以下の内容を評価せずにそのまま残してしまうため、別の結果となります。
Eval(
	EvalExpr(
		Parse(
			Char(
				NameExpr(x)))));