使用公式中的變量在循環中創建列。你好,
我一直在嘗試在循環中創建新列,並在公式中包含幾個變量。 變量是我想要減去的列名。 我已經閱讀過與類似問題的人類似的線程,但這些解決方案都沒有在我的案例中起作用。 我的循環片段:
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,替換命令但沒有產生所需的結果。
還有其他建議嗎?
謝謝
Re:使用公式中的變量在循環中創建列。謝謝Cameron。我知道:名稱問題,但我無法弄清楚如何使它成為一個引用的字符串,似乎Eval Insert是我所缺少的。我曾嘗試解析它,但認為它有點臟,但我沒想過在循環外定義字符串,這使它成為一個非常乾淨的解決方案。Re:使用公式中的變量在循環中創建列。你好 @ jjswan33 ,
歡迎來到社區!
您查看的解決方案都是您想要做的正確解決方案,但您的腳本中有一些問題:
1。您不需要將列引用的範圍限定為公式中的表“ddt”,因為範圍暗示公式中引用的列與列本身在同一個表中。 將“ddt”放入其中將硬編碼到列公式中,這意味著一旦ddt不再定義,公式將不起作用。
2。您需要將列名稱包裝在“:Name()”中,因為列名中有特殊字符,特別是括號。 例如,您可以將列“Var1”稱為:Var1,但不能將“Mean(Var1)”列引用為:Mean(Var1);你需要使用:名稱(“Mean(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))並查看表達式是否正確。
希望這有幫助!
Re:使用公式中的變量在循環中創建列。題轉移到一個新的線程 。