当我尝试动态创建公式列时遇到了一个问题。 我最终确实设法解决了它,但我想知道这里发生了什么。 我的猜测是,它与我构建公式的方式有关,并且“公式”在设置为列之前被评估,然后它以某种方式弄乱了列公式。
这是一个示例:由 test1 和 test2 创建的列确实存在问题,并且 test3 工作正常(test4 和 test5 似乎也工作正常,但我不确定我是否有信心使用它们,因为我不知道他们为什么会得到从字符串转换为列引用)
Names Default To Here(1);
test1 = function({dt, val_col, by_cols}, {Default Local},
ref_list = Transform Each({col_name}, Insert(by_cols, val_col, 1),
Name Expr(As Column(dt, col_name));
);
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Substitute(ref_list, Expr(list), Expr(Col Median))
));
return(new_col);
);
test2 = function({dt, val_col, by_cols}, {Default Local},
ref_list = Transform Each({col_name}, Insert(by_cols, val_col, 1),
Name Expr(As Column(dt, col_name));
);
new_formula = Substitute(ref_list, Expr(list), Expr(Col Median));
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Name Expr(new_formula)
));
return(new_col);
);
test3 = function({dt, val_col, by_cols}, {Default Local},
ref_list = Transform Each({col_name}, Insert(by_cols, val_col, 1),
Name Expr(As Column(dt, col_name));
);
new_formula = Char(Substitute(ref_list, Expr(list), Expr(Col Median)));
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Parse(new_formula)
));
return(new_col);
);
test4 = function({dt, val_col, by_cols}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(Col Median(_new_formula_))
)),
Expr(_new_formula_), Insert(by_cols, val_col, 1)
));
return(new_col);
);
test5 = function({dt, val_col, by_cols}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Substitute(Insert(by_cols, val_col, 1), Expr(List), Expr(Col Median))
));
return(new_col);
);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
by_cols = {"age", "sex"};
val_col = "height";
col1 = test1(dt, val_col, by_cols);
col2 = test2(dt, val_col, by_cols);
col3 = test3(dt, val_col, by_cols);
col4 = test3(dt, val_col, by_cols);
col5 = test3(dt, val_col, by_cols);
Show(col1 << get formula);
Show(col2 << get formula);
Show(col3 << get formula);
Show(col4 << get formula);
Show(col5 << get formula);
//dt1 = dt << Subset(All Rows, Selected columns(0), Suppress formula evaluation(0));
//Close(dt, no save);
例如,如果我打开公式 2 的公式编辑器并按应用,我可能会收到错误消息

有没有办法从“破碎”的公式中恢复过来,是否有可能在创建过程中看到它会破碎? 我可以使用 Parse(Char()) 来获取工作公式,我还可以创建数据的子集,并且公式将在那里工作。
在 Windows 10 上使用 JMP Pro 16.2.0 进行测试。
尝试
Expr(Col Median())
带有额外的 ()。
解析器看到括号并设置功能表达式树中节点上的标志。 没有括号,中位数node 只是一个碰巧有不会被使用的孩子的名字(除了 arg() 和 char() 转换)。 在运行时名称不在变量的名称空间中,并且不会使用内置函数的名称空间,因此消息。
我认为这个解释与所有 5 个测试的行为一致。
公式(...) 与 ColMedian(...) 不同; ColMedian 是一个 JSL 函数。 公式是 NewColumn 消息识别的关键字。 关键字处理需要孩子,所以它可能不需要 expr(Formula()),但可能会很好地使用它。
编辑:我很确定功能标志未通过 arg() 等在 JSL 中公开。