Nouvelle formule de colonne avec JSLJ'essaie d'ajouter une nouvelle formule de colonne à une table en fonction de l'entrée de l'utilisateur. L'entrée peut être une valeur unique ou une sélection de colonne.
J'ai essayé quelques méthodes, mais je n'ai pas pu en trouver une qui puisse gérer cela de manière interchangeable.
Exemple de script que j'ai essayé ci-dessous.
Idéalement, je peux garder l'expression "newcolexpr" la même quelle que soit l'entrée. C'est principalement parce que j'essaie de déployer une colonne de formule personnalisée qui prend beaucoup d'entrées (c'est-à-dire> 8 entrées)
Appréciez l'aide.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//when selection is a single value
//desired outcome: a new column "Test" with formula (1*5)
selection = {1};
newcolexpr = expr(
dt << new column("Test", formula(expr(selection[1])*5))
);
eval(eval expr(newcolexpr));
//when selection is a column (e.g. "height")
//desired outcome: a new column "Test" with formula ("height"*5)
selection = {"height"};
newcolexpr = expr(
dt << new column("Test", formula(expr(selection[1])*5))
);
eval(eval expr(newcolexpr));Personnalisation de masseIngénierie de la qualité et des procédésRe : Nouvelle formule de colonne avec JSLDésolé pour la réponse tardive. Merci @jthi !
J'ai trouvé que ce qui suit fonctionne pour ce que je veux faire:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new_col_expr = expr(
dt << new column("Testing",formula(t1+t2+3))
);
Selection1 = {1,5};
if(Selection1[1] == 1,
Substitute into(new_col_expr,
expr(t1),
Selection1[2]
),
Selection1[1] == 0,
Substitute into(new_col_expr,
expr(t1),
Nameexpr(ascolumn(Selection1[2]))
)
);
Selection2 = {0,"weight"};
if(Selection2[1] == 1,
Substitute into(new_col_expr,
expr(t2),
Selection1[2]
),
Selection2[1] == 0,
Substitute into(new_col_expr,
expr(t2),
Nameexpr(ascolumn(Selection2[2]))
)
);
eval(evalexpr(new_col_expr))Merci pour toutes les références ci-dessus cependant. Ils ont aidé.
Bonne année!
Re : Nouvelle formule de colonne avec JSLLes approches sur la façon d'aborder cela dépendent beaucoup des variables, des entrées et des formules dont vous disposez.
Autre exemple :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
formula_expr = Expr(Expr(dt << New Column("Test", Numeric, Formula(placeholder*5))));
selection = {1};
Eval(Substitute(formula_expr, Expr(placeholder), selection[1]));
selection = {:height};
Eval(Substitute(formula_expr, Expr(placeholder), selection[1]));
formula_expr2 = Expr(Expr(dt << New Column("Test", Numeric, Formula(Sum(placeholder)))));
selection = {1,3};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
selection = {:height, :weight};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
formula_expr3 = Expr(Expr(dt << New Column("Test", Numeric, Formula(Col Sum(placeholder)))));
selection = {:height, :age, :sex};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
Quelques liens :
Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute
Utiliser la liste des colonnes dans les formules
Pouvez-vous construire cela sans écrire expression sous forme de chaîne?
Re : Nouvelle formule de colonne avec JSLHé @jthi Merci pour la réponse. Je pensais aussi comme ça, mais que se passe-t-il si j'ai plus d'une variable à considérer dans la formule ? Nested-if sera-t-il la seule solution (j'essaie vraiment d'éviter cela) ?
Je me demande si la syntaxe peut gérer une variable à l'intérieur de expr() afin que je puisse attribuer un nombre ou NameExpr(asColumn()) en fonction du type d'entrée avant de remplacer dans l'expression.
Re : Nouvelle formule de colonne avec JSLTrès probablement, vous devrez vérifier l'entrée, puis créer une colonne basée sur celle-ci (vous pouvez vérifier à l'intérieur de la formule Expr in, mais c'est plus clair de cette façon). Ci-dessous une option :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new_col_expr = Expr(
cur_sel = selection[1];
show(cur_sel);
If(IsNumber(cur_sel),
Eval(EvalExpr(dt << New Column("Test", Numeric, Formula(Expr(cur_sel)*5))));
,
Eval(EvalExpr(dt << New Column("Test", Numeric, Formula(Expr(NameExpr(AsColumn(cur_sel)))*5))));
);
);
selection = {1};
new_col_expr;
selection = {"height"};
new_col_expr;