リストを操作する関数は、ほとんどの式を処理することもできます。必ずExpr()を使って式をクォートしてください。例:
Remove( Expr( A + B + C + D ), 2 ); // 式A + C + Dになる
b = Substitute( Expr( Log( 2 ) ^ 2 / 2 ), 2, 3 ); /* 式Log( 3 ) ^ 3 / 3になる */
リストの場合と同様、インプレース関数の第1引数はL-valueでなければなりません。L-valueとは、値を代入できる変数などのエンティティです。インプレース関数は、リストまたは式を直接操作します。これらは、たとえば、Remove FromやInsert Intoなどのように、関数名にFromまたはIntoが付いています。結果を戻さないため、結果を見るには式を表示する必要があります。
polynomial = Expr( a * x ^ 2 + b * x + c );
Insert Into( polynomial, Expr( d * x ^ 3 ), 1 );
Show( polynomial );
polynomial = d * x ^ 3 + a * x ^ 2 + b * x + c
インプレース関数でない場合には、式を直接記述するか、式を含む変数の名前をNameExprに指定する必要があります。そうした関数は名前の中にFromあるいはIntoを含みません。このタイプの関数は、第1引数の元のリストや式には直接、変更を加えないで、変更した後のリストや式を戻します。
cubic = Insert( Expr( a * x ^ 2 + b * x + c ), Expr( d * x ^ 3 ), 1 );
d * x ^ 3 + a * x ^ 2 + b * x + c
quadratic = Expr( a * x ^ 2 + b * x + c );
cubic = Insert( Name Expr( quadratic ), Expr( d * x ^ 3 ), 1 );
d * x ^ 3 + a * x ^ 2 + b * x + c
置換はとても強力な機能です。すでに説明したSubstitute(置換)を参照してください。
ここでは、式で置換を行うときの注意点をいくつか説明します。
Substitute(pattern,name,replacement)は式の名前を置き換えます。
NameExpr()は指定された変数に含まれている式を、評価せずに戻します。
a = Expr(
Distribution( Column( x ), Normal Quantile Plot )
);
Show( Name Expr( a ) );
Name Expr(a) = Distribution(Column(x), Normal Quantile Plot);
Substitute()では引数がすべて評価されるため、引数を正しくクォートする必要があります。
b = Substitute( Name Expr( a ), Expr( x ), Expr( :Name("体重(ポンド)") ) );
Show( Name Expr( b ) );
Name Expr(b) = Distribution(Column(:Name("体重(ポンド)")), Normal Quantile Plot);
SubstituteInto()の場合、第1引数はL-value(左辺に指定できるもの)です。NameExprを用いる必要はありません。
Substitute Into( a, Expr( x ), Expr( :Name("体重(ポンド)") ) );
Show( Name Expr( a ) );
Name Expr(a) = Distribution(Column(:Name("体重(ポンド)")), Normal Quantile Plot);
Substitute()は式の一部を変更するときに便利な関数です。次の例は、Is NumberやIs Matrix関数などの複数の関数を用いる例です。
data = {1, {1, 2, 3}, [1 2 3], "abc", x, x( y )};
ops = {is number, is list, is matrix, is string, is name, is expr};
m = J( N Items( data ), N Items( ops ), 0 );
test = Expr(
m[r, c] = _op( data[r] )
);
For( r = 1, r <= N Items( data ), r++,
For( c = 1, c <= N Items( ops ), c++,
Eval( Substitute( Name Expr( test ), Expr( _op ), ops[c] ) )
)
);
Show( m );
m =
[1 0 0 0 0 0,
0 1 0 0 0 1,
0 0 1 0 0 0,
0 0 0 1 0 0,
0 0 0 0 1 1,
0 0 0 0 0 1];
SubstituteInto()を使うと、JMPで2次方程式を求めることができます。次の例では、4x2 - 9 = 0を求めています。
/* 次の方程式の解を求める
a*x^2 + b*x + c = 0
2次の式はx=(-b + - sqrt(b^2 - 4ac))/2a
リストを使って、+-演算の+と-両方の結果を保存する */
x = {Expr(
(-b + Sqrt( b ^ 2 - 4 * a * c )) / (2 * a)
), Expr(
(-b - Sqrt( b ^ 2 - 4 * a * c )) / (2 * a)
)};
Substitute Into( x, Expr( a ), 4, Expr( b ), 0, Expr( c ), -9 );
// 係数に挿入する
Show( x ); // 置換結果を表示する
Show( Eval Expr( x ) ); // 解を表示する
x = {Expr(((-0) + Sqrt(0 ^ 2 - 4 * 4 * -9)) / (2 * 4)), Expr(((-0) - Sqrt(0 ^ 2 - 4 * 4 * -9)) / (2 * 4))};
Eval Expr(x) = {1.5, -1.5};
リストと式を操作する関数については、この前の節、リストの操作で説明していますが、その概要を表8.4に示します。
関数 |
構文 |
説明 |
---|---|---|
Remove |
x = Remove(list |expr) x = Remove(list |expr, position) x = Remove(list |expr, {positions}) x = Remove(list |expr, position, n) |
指定の場所(position)の項目を削除したリスト(list)または式(expr)を戻す。場所(position)を省略したときは、最後の項目が削除されます。positionをリストで指定することもできます。追加の引数nを指定すると、1つの項目ではなくn個の項目が削除されます。 |
Remove From |
Remove From(list|expr, position) Remove From(list|expr) Remove From(list|expr, position, n) |
リストから項目を削除する。よって、戻り値を何かに割り当てることはできません。第1引数はL-value(左辺に指定できるもの)でなければなりません。 |
Insert |
x = Insert(list|expr, item, position) x = Insert(list|expr, item) |
リスト(list)または式(expr)の指定箇所(position)に項目(item)を挿入する。位置を指定しない場合、文字列は末尾に挿入されます。 |
Insert Into |
Insert Into(list|expr, item, position) Insert Into(list|expr, item) |
Insert関数と同じだが、結果を元の変数に格納する。リスト(list)や式(expr)はL-value(左辺に指定できるもの)でなければなりません。 |
Shift |
x = Shift(list |expr) x = Shift(list |expr, n) |
1つまたはn個の項目を、リスト(list)または式(expr)の前から後ろへシフトする。nの値が負のときは、後ろから前へシフトします。 |
Shift Into |
Shift Into(list|expr) Shift Into(list|expr, n) |
項目をシフトして、その結果を元の変数に割り当てる。 |
Reverse |
x=Reverse(list|expr) |
リスト(list)や式(expr)の項目の順序を逆にする。 |
Reverse Into |
Reverse Into(list|expr) |
リスト(list)や式(expr)の項目の順序を逆にし、結果を元の変数に割り当てる。 |
Sort List |
x=Sort List(list|expr) |
リスト(list)や式(expr)の項目を並べ替える。まず数値を昇順に並べ、その後に名前・文字列・演算子の内部コード順に並べます。たとえば、名前値Addは名前値Subtractより順位が低いため、1+2は1-2より低くなります。低い方から、{1,2}、{1,3}、{1,3,0}という順序になります。{1000}は{“a”}より低く、{a}と{“a”}は同位です。 |
Sort List Into |
Sort List Into(list|expr) |
リスト(list)や式(expr)の項目を並べ替え、その結果を元の変数に割り当てる。 |
Sort Ascending |
Sort Ascending(list|matrix) |
リスト(list)または行列(matrix)の要素を昇順に並べたリストを戻す。 |
Sort Descending |
Sort Descending(list|matrix) |
リスト(list)または行列(matrix)の要素を降順に並べたリストを戻す。 |
Loc Sorted |
Loc Sorted(A, B) |
行列Aの値と行列Bの値が一致する位置を、添え字の行列で作成する。Aは昇順に並べた行列でなければなりません。 |
Substitute |
R = Substitute(list|expr, Expr(pattern), Expr(replacement), ...) |
リスト(list)または式(expr)の中で、指定のパターン(pattern)に一致する部分を検索し、replacement式で置き換える。パターン(pattern)は名前でなければなりません。第2引数と第3引数は適用される前に評価されるため、ほとんどの場合、Expr関数を使って引数をクォートする必要があります。引数の評価を延期するときは、Exprの代わりにName Exprを使います。複数の置換を実行する場合、1つのステートメントでpatternとreplacementのペアを複数指定できます。 |
Substitute Into |
Substitute Into(list|expr, Expr(pattern), Expr(replacement), ...) |
Substitute関数と同じだが、結果を元の変数に格納する。リスト(list)や式(expr)はL-value(左辺に指定できるもの)でなければなりません。 |