数式列を動的に作成しようとしたときに問題が発生しました。 最終的にはなんとか解決できましたが、ここで何が起こっているのか知りたいです。 私の推測では、それは私が数式を作成する方法に何らかの形で関連しており、「数式」は列に設定される前に評価され、その後、何らかの形で列の数式を台無しにします。
次に例を示します。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())を使用して数式を取得できます。また、データのサブセットを作成すると、数式がそこで機能します。
Windows10のJMPPro16.2.0でテスト済み。
試す
Expr(Col Median())
余分な()付き。
パーサーはパーレンを確認し、働き式ツリーのノードのフラグ。 両親がいなければ、中央値の列nodeは、使用されない子がたまたまある名前です(arg()およびchar()変換を除く)。 実行時には、名前は変数の名前空間に含まれておらず、組み込み関数の名前空間は使用されないため、メッセージが表示されます。
この説明は、5つのテストすべての動作と一致していると思います。
方式(...)はColMedian(...)とは異なります。 ColMedianはJSL関数です。 方式NewColumnメッセージが認識するキーワードです。 キーワード処理は子を想定しているため、expr(Formula())は必要ないかもしれませんが、おそらく問題なく機能します。
編集:私はかなり確信しています働きフラグは、arg()などを介してJSLで公開されません。