数式列を動的に作成しようとしたときに問題が発生しました。 最終的には解決できましたが、何が起こっているのか知りたいです。 私の推測では、それは式の作成方法に何らかの形で関連しており、列に設定される前に「式」が評価され、列の式が何らかの形で台無しになっているのではないかと考えられます。
以下に例を示します。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);
たとえば、Formula 2 の数式エディタを開いて適用を押すと、エラーが発生する可能性があります。

「壊れた」数式から回復する方法はありますか? また、作成中に壊れることがわかる可能性はありますか? Parse(Char()) を使用して機能する数式を取得できます。また、データのサブセットを作成することもでき、数式はそこで機能します。
Windows 10 上の JMP Pro 16.2.0 でテスト済み。
試す
Expr(Col Median())
余分な()付き。
パーサーは括弧を見て、関数式ツリー内のノードのフラグ。 括弧なしでは、コル中央値node は、(arg() と char() の変換を除いて) 使用されない子をたまたま持つ名前です。 実行時には、名前は変数の名前空間に存在せず、組み込み関数の名前空間は使用されないため、メッセージが表示されます。
この説明は 5 つのテストすべての動作と一致していると思います。
方式(...) は ColMedian(...) とは異なります。 ColMedian は JSL 関数です。 方式NewColumn メッセージが認識するキーワードです。 キーワード処理では子を想定しているため、 expr(Formula()) は必要ないかもしれませんが、おそらく expr(Formula()) を使用しても問題なく動作するでしょう。
編集:私はかなり確信しています関数フラグは arg() などを介して JSL で公開されません。