帶有 JSL 的新列公式我正在嘗試根據用戶輸入將新列公式添加到表中。 輸入可以是單個值或列選擇。
一直在嘗試幾種方法,但我無法找到一種可以互換處理的方法。
我在下面嘗試過的示例腳本。
理想情況下,無論輸入如何,我都可以保持“newcolexpr”表達式相同。 這主要是因為我正在嘗試部署需要大量輸入的自定義公式列(即 >8 個輸入)
感謝幫助。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//when selection is a single value
//desired outcome: a new column "Test" with formula (1*5)
selection = {1};
newcolexpr = expr(
dt << new column("Test", formula(expr(selection[1])*5))
);
eval(eval expr(newcolexpr));
//when selection is a column (e.g. "height")
//desired outcome: a new column "Test" with formula ("height"*5)
selection = {"height"};
newcolexpr = expr(
dt << new column("Test", formula(expr(selection[1])*5))
);
eval(eval expr(newcolexpr));腳本編寫回复:使用 JSL 的新列公式很可能您必須檢查輸入,然後基於該輸入創建列(您可以在公式中的 Expr 內部進行檢查,但這樣更清楚)。 下面是一種選擇:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new_col_expr = Expr(
cur_sel = selection[1];
show(cur_sel);
If(IsNumber(cur_sel),
Eval(EvalExpr(dt << New Column("Test", Numeric, Formula(Expr(cur_sel)*5))));
,
Eval(EvalExpr(dt << New Column("Test", Numeric, Formula(Expr(NameExpr(AsColumn(cur_sel)))*5))));
);
);
selection = {1};
new_col_expr;
selection = {"height"};
new_col_expr;回复:使用 JSL 的新列公式嘿@jthi感謝您的回复。 我也是這麼想的,但是如果我在公式中要考慮的變量超過 1 個呢? 嵌套-如果是唯一的解決方案嗎(我真的很想避免這種情況)?
我想知道語法是否可以處理 expr() 內部的變量,以便我可以在代入表達式之前根據輸入類型分配一個數字或 NameExpr(asColumn()) 。
回复:使用 JSL 的新列公式如何解決這個問題的方法在很大程度上取決於您擁有的變量、輸入和公式。
其他例子:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
formula_expr = Expr(Expr(dt << New Column("Test", Numeric, Formula(placeholder*5))));
selection = {1};
Eval(Substitute(formula_expr, Expr(placeholder), selection[1]));
selection = {:height};
Eval(Substitute(formula_expr, Expr(placeholder), selection[1]));
formula_expr2 = Expr(Expr(dt << New Column("Test", Numeric, Formula(Sum(placeholder)))));
selection = {1,3};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
selection = {:height, :weight};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
formula_expr3 = Expr(Expr(dt << New Column("Test", Numeric, Formula(Col Sum(placeholder)))));
selection = {:height, :age, :sex};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
一些鏈接:
使用 Eval Insert、Eval Expr、Parse 和 Substitute 將一個表達式插入到另一個表達式中
在公式中使用列列表
你能在不把表達式寫成字符串的情況下構造它嗎?
回复:使用 JSL 的新列公式回复晚了非常抱歉。 謝謝@jthi !
我發現以下適用於我想做的事情:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new_col_expr = expr(
dt << new column("Testing",formula(t1+t2+3))
);
Selection1 = {1,5};
if(Selection1[1] == 1,
Substitute into(new_col_expr,
expr(t1),
Selection1[2]
),
Selection1[1] == 0,
Substitute into(new_col_expr,
expr(t1),
Nameexpr(ascolumn(Selection1[2]))
)
);
Selection2 = {0,"weight"};
if(Selection2[1] == 1,
Substitute into(new_col_expr,
expr(t2),
Selection1[2]
),
Selection2[1] == 0,
Substitute into(new_col_expr,
expr(t2),
Nameexpr(ascolumn(Selection2[2]))
)
);
eval(evalexpr(new_col_expr))感謝以上所有參考。 他們幫助了。
新年快樂!