當我嘗試動態創建公式列時遇到了一個問題。 我最終確實設法解決了它,但我想知道這裡發生了什麼。 我的猜測是,它與我構建公式的方式有關,並且“公式”在設置為列之前被評估,然後它以某種方式弄亂了列公式。
這是一個示例:由 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 中公開。