如何使用列值作為腳本中公式的輸入?全部,
我相信我的問題非常基本,但我還沒有找到答案。
我有一個數據表,如下所示

我希望
a) 包含 3 個標記為 %CFB 第 3 列的新列, %CFB 第 4 列和%CFB 第 5 列。 %CFB 代表相對於基線的變化百分比。
b)在每個新列中,我希望輸入與基線相比的變化百分比以及從以下公式得出的值
%CFB = (x - 第 3 列)/第 3 列,其中「x」將在下面編碼的每次迭代中替換為第 3、4 或 5 列中的值。第 3 列是基線值
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
New column ("%CFB " || data_col) << Formula((( :data_col - :column 3) / :column 3) * 100 ));
使用上面的腳本我已經能夠建立新列,但沒有將公式的結果放入其中。當我手動交換時第3欄為了資料列在公式中,所有新列都按我的預期計算為零。這告訴我該公式至少是正確的,並且 data_col 變數沒有按照我的意願進行解釋/替換。任何有關使其發揮作用的見解將不勝感激。
先感謝你的幫助
佛洛伊德·福克斯
回覆:如何使用列值作為腳本中公式的輸入?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />不知道有多少意見值得歡迎,但就這樣吧。
就我個人而言,我是 Eval(Parse()) 的巨大反對者,因為它大大降低了編輯器內的可讀性。我看過 5000 行腳本,大部分都是粉紅色的(或你為字串選擇的任何顏色)。透過替換表達式的能力,您可以保持語法突出顯示完整,並且我認為這可以使編輯其他人的腳本變得更加容易。
我仍然偶爾使用 eval(parse()),但在必要時我會嘗試使用 JSL quote()。
回覆:如何使用列值作為腳本中公式的輸入?關於處理範圍的優秀說明王克將它們全部包裝在一起佛洛伊德福克斯FB帶有一些程式碼格式。
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
new_col_name = "%CFB " || data_col;
Eval(
Eval Expr(
dt << New Column( Expr(new_col_name),
Numeric,
Continuous,
Formula( ((Column( dt, Expr( data_col ) )[] - :column 3) / :column 3) * 100 )
)
)
);
);
變數範圍的另一個解決方法是使用 Set Each Value(equation) 而不是 Formula(equation)。這樣做的好處是使用較少的資源,因為不計算公式,但它的缺點是修改所述公式會造成損失。
就像任何好的事情一樣,有很多方法可以使用正確的工具來解決問題。正如您所提到的,當事情開始變得更高級時,Substitute() 也是一個不錯的選擇。Substitute 與 Parse() 結合使用特別有用,Parse() 將字串轉換為 JSL 程式碼,而 Eval() 則允許執行 JSL,這會導致 Eval(Parse(Substitute())) 語句。當圍繞內建 JMP 平台包裝功能時,最後一項技術特別有用。為了進一步說明 parse() 和 eval(parse) 的組合,我提供了一個簡單的範例。

快樂編碼!
回覆:如何使用列值作為腳本中公式的輸入?你好,
在本範例中,變數 data_col 仍然出現在公式中。由於您在 For 迴圈中指派 data_col,因此循環完成後對公式求值的任何嘗試都會在所有三個新欄位中產生相同的值。這是因為 data_col 將表示 For 迴圈中的最後一個值「第 5 列」。此外,假設您儲存該表,然後關閉 JMP。當您在 JMP 的新實例中再次開啟表格並嘗試計算公式時,將出現錯誤,因為 JMP 不再知道 data_col 應該表示什麼。
當您在公式中使用變數時,您需要執行一些操作來指示 JMP 在計算公式之前將變數替換為其值。您可以使用 Substitute(),但我發現 Eval Expr() 方法(如文斯.法勒0提到的)對於大多數人來說更容易實現。Eval Expr() 告訴 JMP 計算(替換)您作為參數提供的表達式中包含在 Expr() 函數中的任何變數。 外部 Eval() 將導致 JMP 在替換發生後評估整個 New Column 語句。JMP 使用說明41824也體現了這個概念。
我希望這有幫助。
溫蒂
回覆:如何使用列值作為腳本中公式的輸入?文斯,
這次真是萬分感謝。坦白說,我必須閱讀您提供的表達式,但我非常感謝您對我的程式碼不起作用的原因的洞察。
問候
佛洛伊德
回覆:如何使用列值作為腳本中公式的輸入?內特,
感謝這個程式碼的工作,並且有一個額外的好處,我可以理解程式碼背後的邏輯。
佛洛伊德
回覆:如何使用列值作為腳本中公式的輸入?文斯.法勒0確實準確地找出了問題的根源。資料表中沒有名為 data_col 的欄位。因此,所編寫的程式碼引用了不存在的東西。此外,Vince 還展示了一些使用 JSL 編寫程式碼來保存動態引用的強大方法。也就是說,在任何好的語言中,您都會有多種選擇來執行邏輯。
我建議使用另一種引用該列的格式。雖然簡單的格式是使用分號和列名來引用當前資料表的列,但更強大的方法是使用列(資料表引用、列字串或數字)格式。下面我稍微修改了您的程式碼以使用該格式。
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
col_name = "%CFB " || data_col;
dt << New Column(col_name,
Numeric,
Continuous,
Formula( ((column(dt, data_col)[] - :column 3) / :column 3) * 100 ) );
);
回覆:如何使用列值作為腳本中公式的輸入?你不能做 :variable (尤其是字串,這是 <
如果你把它改成
data_col = Column( i ) ;
Eval(EvalExpr(New column ("%CFB " || Expr(data_col<<GET name=""></GET>
它應該有效。
它只是用實際值而不是變數來取代 EvalExpr() 中的所有 Expr()。