Eval Insert、Eval Expr、Parse、Substitute を使用して、ある式を別の式に挿入する問題変数の値を挿入する必要があります式に入れるコード全体を評価せずに。例としては次のものが挙げられます。
- スクリプトを使用して列の式を作成する
- 別のスクリプトを使用してスクリプトを作成する
以下は、テーブル内の選択された列を変換するスクリプトです。 これはそうなりますない式 'cols[i]' が列名ではなく列式に保存されるため、機能します。
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//This code does not work
For( i = 1, i <= N Items(cols), i++,
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( cols[i] ) * 2)
)
);
新しい列は正しい名前で作成されますが、次の式になります。

解決
これを解決するには 2 つの一般的な戦略があります。1 つは残りの前に式の一部を評価しながら式を構築する方法、もう 1 つは式を文字列として構築してからそれを評価する方法です。 挿入される変数は、実際には任意の長さの式にすることができることに注意してください。
式
これらの方法には、式を作成し、その一部を残りの前に評価することが含まれます。 Eval、Eval Expr、および Expr の正しい組み合わせを見つけるのは難しい場合がありますが、構文の強調表示を確認し、スクリプト エディターを使用してかっこが一致していることを確認できます。
評価、評価式
式を記述し、すぐに評価する必要がある部分を Expr() でラップします。
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( Expr( Char( cols[i] ) ) ) * 2)
)
) )
);
代わりの
式を記述し、その一部を評価されたコードに置き換えます。
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Substitute(
Expr( dt << New Column(
"2 * " || cn,
Numeric,
"Continuous",
Formula( As Column( cn ) * 2)
) ),
Expr( cn ),
Char( cols[i] )
) )
);
文字列メソッド
これらのメソッドでは、式を文字列として書き込み、Parse() を使用して式に変換し、その後 Eval() で実際に評価します。 これらの方法の欠点としては、構文の強調表示が表示されないこと、\!" または \[ ... ]\ を使用して二重引用符を処理する必要があること、特に長い式の場合、将来のトラブルシューティングや変更が一般に困難であることが挙げられます。
評価インサート
評価されて文字列内に配置される「インライン」コードを含む文字列として式を記述し、それを解析して評価します。
//Eval Insert
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Eval Insert(
"\[dt << New Column(
"2 * ^Char( cols[i] )^",
Numeric,
"Continuous",
Formula( As Column( "^Char( cols[i] )^" ) * 2)
)]\"
) ) );
);
代わりの
評価された式で置き換えられるプレースホルダーを使用して、式を文字列で記述します。 これは上記と同じ関数であることに注意してください。
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"2 * ColumnName",
Numeric,
"Continuous",
Formula( As Column( "ColumnName" ) * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
連結する
最も基本的な形式は、「||」を使用して式を記述します。\!" の代わりに \[ ... ]\ を使用できることに注意してください。
//Concatenate
For( i = 1, i <= N Items(cols), i++,
Eval( Parse(
"dt << New Column(
\!"2 * " || Char( cols[i] ) || "\!",
Numeric,
\!"Continuous\!",
Formula( As Column( \!"" || Char( cols[i] ) || "\!" ) * 2)
)"
) );
);
関連項目
スクリプト ガイドの「式処理関数」セクションには、同じことを実現するためのこれらのメソッドと他のメソッドが含まれています。このブログ投稿による@ジョセフ・モーガンには、同じトピックに関する追加の例と洞察が含まれています。
ありがとう@ジャスティン・チルトンこの投稿に関するフィードバックについては、
変数または式を他の式に挿入します。これは、Eval()、Eval Expr()、Substitute()、Parse()、および Eval Insert() の簡単な紹介です。
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入する式メソッドと文字列メソッドの例を次に示します。
Names default to here(1);
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"Eval Expr 2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( Expr( cols[i] ) * 2 )
)
) )
);
//Substitute with String
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"Substitute String 2 * ColumnName",
Numeric,
"Continuous",
Formula( :"ColumnName"n * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入するこれには不要な関数がいくつか含まれている可能性がありますが、列参照 (As Column(name)) で Name Expr を使用できます。
Names Default To Here(1);
//Open A Table and select a few columns
dt = Open("$Sample_data/iris.jmp");
cols = {Sepal length, Petal length};
For(i = 1, i <= N Items(cols), i++,
Eval(Eval Expr(dt << New Column("2 * " || Char(cols[i]), Numeric, "Continuous", Formula(Expr(Name Expr(As Column(Char(cols[i])))) * 2))))
);
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入するAs Column() を必要としない方法はありますか?
ここでは文字列を渡すときにそれを含める必要がありますが、数式に :column を残すにはどうすればよいでしょうか。
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入するどうもありがとう! はい。 ループの開始は正しいです。 私はそれを知りませんでした。
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入する@グリーンホーン、
for ループは i=2 で開始されるため、最初の列がスキップされ、データ テーブルの作成時に列 1 と呼ばれる単一の空白列が作成されました。 この問題は、次のように i=1 でループを開始し、その後列 1 を削除することで「修正」できます。
もっと見る... Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入するこんにちは、そうです。
列bとcでは機能しました。 「a」は表示されません。 代わりに、空の列 1 が表示されます。
そこで、New Table()の中にforループを入れてみました。 しかし、このアプローチでは、数式内の式だけを取得します。
必要な列をすべて一度に取得するために、New Table() 内の式で「for ループ」を処理する方法をご存知ですか?
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入するこんにちは@グリーンホーン、
列式に入ると他のテーブルを参照する方法が分からないため、式に式を入れる前にその式を評価するように JMP に指示する必要があります。 私の好みの方法 (上記の一番上の方法) を使用すると、次のようになります。
Names Default To Here( 1 ); //
//Table with columns you want to create
mydt = New Table( "Source",
Add Rows( 3 ),
New Column( "Name", Character, "Nominal", Set Values( {"a", "b", "c"} ) ),
New Column( "Mean", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 3] ) ),
New Column( "Std Dev", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [0.5, 0.6, 0.7] ) )
);
my_newdt = New Table( "Target", Add Rows( 100 ) );
// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
Eval( Eval Expr(
my_newdt << New Column( Column( mydt, 1 )[i],
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Expr( As Column( mydt, :Mean )[i] ), Expr( As Column( mydt, :Std Dev )[i] ) ) )//
)
) )
);
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入する列に数式を含むテーブルの作成 - Random Normal() - 外部 jmp から
私の問題に対する有効な解決策はすでにあります。 上のリンク。
ただし、私はコードを正しく動作させることに執着しています。
そして、このスレッドは私のトピックに反応しているようです。
上記のテクニックをいくつか試してみました。 でもうまくいかない、もしくは理解できない。
私に何か提案はありますか? 式の取得方法」列として( mydt, :Mean )[1] " ソース値に解決されましたか?
//not working
Clear Globals();
Names Default To Here( 1 ); //
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name",
// Add Rows( N Rows( mydt ) ), // row count can be set by hand e.g. 1000
Add Rows( 10 ), // row count can be set by hand e.g. 1000
New Column( Column( mydt, 1 )[1], // Loop i==1
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( As Column( mydt, :Mean )[1], 0.01))// As Column(mydt, :Mean )[1] is evalueted in the target table. But Formula has the expression "As Column( mydt, :Mean )[1]" instead of a value from source table
)
);// End New data table
/*// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
my_newdt << New Column( Column( mydt, 1 )[i], // Loop i ==2
Numeric,
"Continuous",
Format( "Best", 6 ),
Set Each Value( Random Normal( As Column( mydt, :Mean )[i], As Column( mydt, :Std Dev )[i] ) )//
)
)// End for loop;
;*/
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入する非常に便利!
Re: Eval Insert、Eval Expr、Parse、Substitute を使用してある式を別の式に挿入するJSL 式を動的に構築するために使用できるメソッドの優れたレビュー。これをマスターすれば、すべてが非常に簡単になります。