带有 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))感谢以上所有参考。 他们帮助了。
新年快乐!