Beim Versuch, Formelspalten dynamisch zu erstellen, ist ein Problem aufgetreten. Am Ende habe ich es geschafft, es zu lösen, aber ich würde gerne wissen, was hier passiert. Ich vermute, dass es irgendwie damit zusammenhängt, wie ich die Formel erstelle, und dass die „Formel“ ausgewertet wird, bevor sie auf „Spalte“ festgelegt wird, und dann die Spaltenformel irgendwie durcheinander bringt.
Hier ist ein Beispiel: Von test1 und test2 erstellte Spalten weisen Probleme auf und test3 funktioniert einwandfrei (test4 und test5 scheinen ebenfalls einwandfrei zu funktionieren, aber ich bin mir nicht sicher, ob ich mich bei der Verwendung sicher fühlen würde, da ich keine Ahnung habe, warum sie funktionieren aus Strings in Spaltenverweise umgewandelt)
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);
Wenn ich zum Beispiel den Formeleditor der Formel 2 öffne und auf „Anwenden“ drücke, erhalte ich möglicherweise eine Fehlermeldung

Gibt es eine Möglichkeit, die „kaputten“ Formeln zu reparieren, und besteht die Möglichkeit, während der Erstellung zu sehen, dass sie kaputt gehen? Ich kann Parse(Char()) verwenden, um eine funktionierende Formel zu erhalten, und ich kann auch eine Teilmenge der Daten erstellen, und die Formeln funktionieren dort.
Getestet mit JMP Pro 16.2.0 unter Windows 10.
versuchen
Expr(Col Median())
mit dem Extra ().
Der Parser sieht die Parens und legt die fest Funktion Flag auf dem Knoten in der Ausdrucksbaumstruktur. Ohne Eltern, die Col Median node ist nur ein Name, der zufällig untergeordnete Elemente hat, die nicht verwendet werden (außer bei der Konvertierung von arg() und char()). Zur Laufzeit befindet sich der Name nicht im Namensraum von Variablen und der Namensraum integrierter Funktionen wird nicht verwendet, daher die Meldung.
Ich denke, diese Erklärung stimmt mit dem Verhalten aller fünf Tests überein.
Formel (...) unterscheidet sich von ColMedian(...); ColMedian ist eine JSL-Funktion. Formel ist ein Schlüsselwort, das die NewColumn-Nachricht erkennt. Die Schlüsselwortverarbeitung erwartet untergeordnete Elemente, sodass expr(Formula()) möglicherweise nicht erforderlich ist, aber wahrscheinlich problemlos damit funktionieren würde.
edit: Ich bin mir ziemlich sicher Funktion Flag wird in JSL nicht über arg() usw. verfügbar gemacht.