J'ai rencontré un problème lorsque j'ai essayé de créer dynamiquement des colonnes de formules. J'ai réussi à le résoudre à la fin, mais j'aimerais savoir ce qui se passe ici. Je suppose que cela est en quelque sorte lié à la façon dont je construis la formule et que la "formule" est évaluée avant d'être définie sur la colonne, puis cela gâche en quelque sorte la formule de la colonne.
Voici un exemple : les colonnes créées par test1 et test2 ont des problèmes et test3 fonctionne correctement (test4 et test5 semblent également fonctionner correctement, mais je ne suis pas sûr que je me sentirais en confiance pour les utiliser car je ne sais pas pourquoi ils obtiennent convertis en références de colonne à partir de chaînes)
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);
Si, par exemple, j'ouvre l'éditeur de formules de Formule 2 et que j'appuie sur Appliquer, je risque d'obtenir une erreur

Existe-t-il un moyen de récupérer des formules "cassées" et y a-t-il une possibilité de le voir lors de la création qu'il se cassera? Je peux utiliser Parse(Char()) pour obtenir une formule de travail et je peux également créer un sous-ensemble de données et les formules y fonctionneront.
Testé avec JMP Pro 16.2.0 sous Windows 10.
essayer
Expr(Col Median())
avec le supplément ().
L'analyseur voit les parenthèses et définit le fonction drapeau sur le nœud dans l'arborescence d'expression. Sans parenthèse, le Col médian node est juste un nom qui a des enfants qui ne seront pas utilisés (sauf par la conversion arg() et char()). Au moment de l'exécution, le nom n'est pas dans l'espace de noms des variables et l'espace de noms des fonctions intégrées ne sera pas utilisé, d'où le message.
Je pense que cette explication est cohérente avec le comportement des 5 tests.
Formule (...) est différent de ColMedian(...); ColMedian est une fonction JSL. Formule est un mot-clé reconnu par le message NewColumn. La gestion des mots-clés attend des enfants, il se peut donc qu'elle n'ait pas besoin de expr(Formula()), mais fonctionnerait probablement très bien avec elle.
edit: je suis presque sûr que le fonction flag n'est pas exposé dans JSL via arg(), etc.