こんにちは、
式に2つの変数を使用して、ループ内に新しい列を作成しようとしています。 変数は、減算しようとしている列名です。 私は似たような問題を抱えている人々と似たスレッドを読みましたが、それらの解決策のどれも私の場合にはうまくいきませんでした。 私のループの断片:
for (i=1, i<=n, i++,
S="Mean("||vars[i]||")";
S2="Wafer Mean("||vars[i]||")";
ddt << Update(
With(wt),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval(cats) = Eval(cats)
),
Add Columns from Update table(
wt:S2;
)
);
ddt << New Column("Delta from wafer mean("||vars[i]||")", numeric, continuous, formula(ddt:S-ddt:S2));
ddt << Run formulas;
);
問題は、JMPが文字通りそれを読み、Sを文字列ではなく式に入れることです。 私はさまざまなeval、evalexpr、expr、代替コマンドを試しましたが、どれも必要な結果を生み出していません。
他に何か提案はありますか?
ありがとう
こんにちは @ jjswan33 、
コミュニティへようこそ!
あなたが調べた解決策はあなたがやりたいことのためのすべての適切な解決策です、しかしあなたはあなたのスクリプトの中にいくつかの問題を抱えています:
1。式で参照されている列が列自体と同じ表にあることが暗黙的に示されているため、式では列参照を表 "ddt"に参照する必要はありません。 そこに "ddt"を入れると、それを列の式にハードコーディングすることになります。これは、ddtが定義されなくなると式が機能しなくなることを意味します。
2。列名には特殊文字、具体的には括弧が含まれているため、列名を ":Name()"で囲む必要があります。 たとえば、列 "Var1"をVar1として参照することはできますが、列 "Mean(Var1)"を次のように参照することはできません。Mean(Var1);あなたが使用する必要があるでしょう:名前( "平均(Var1)")。
今は、Eval(Parse(Eval Insert()))の一部であるため、理解するのはとても簡単です。 最も内側の部分であるEval Insertから始めて、外側に向かって進みましょう。
- Eval Insert() - これを使用して文字列内の変数を評価します。 文字列の内側で、文字列内で評価したいすべての変数の周囲に "^"文字を置きます。 例えば:
age = 30;
Eval Insert("She is ^age^ years old");
//Returns "She is 30 years old"文字列の中に二重引用符を使用する必要がある場合(実際にはそうします)、文字列を "\ ["で始めて "] \"で終わると便利です。 これにより、文字列内で二重引用符を自由に使用できます。 あるいは、エスケープ構文を使用して、文字列内に二重引用符(つまり\!")を追加することもできます。 これはあなたのために働くべき文字列です:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\"; - Parse() - 文字列を式に変換します。
- Eval() - 文字列から解析した式を評価します。
すべてまとめるには、次のようにします。
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\";
For( i = 1, i <= n, i++,
S = "Mean(" || vars[i] || ")";
S2 = "Wafer Mean(" || vars[i] || ")";
ddt << Update(
With( wt ),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval( cats ) = Eval( cats )
),
Add Columns from Update table( wt:S2 )
);
Eval(Parse(Eval Insert( str )));
ddt << Run formulas;
);ループの外側で文字列を定義するのをスキップして、ループ内のEval Insertに直接文字列を貼り付けることもできます。 しかし、これによってコードのデバッグが少し簡単になると思います。 エラーがある場合は、それを使ってParse(Eval Insert(str))を見て、式が正しいかどうかを確認してください。
うまくいけば、それが役立ちます!