Nouvelle formule de colonne avec JSLJ'essaie d'ajouter une nouvelle formule de colonne à un tableau 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é plusieurs méthodes, mais je n'ai pas pu en obtenir 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 formules 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));ScriptRe: Nouvelle formule de colonne avec JSLTrès probablement, vous devrez vérifier l'entrée, puis créer une colonne en fonction de cela (vous pouvez vérifier dans la formule Expr in, mais c'est plus clair de cette façon). Vous trouverez 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;Re: Nouvelle formule de colonne avec JSLHey @jthi Merci pour la réponse. Je pensais aussi comme ça, mais que se passe-t-il si j'ai plus d'une variable à prendre en compte dans la formule ? Est-ce que nested-if sera la seule solution là-bas (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 le substituer dans l'expression.
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érez une expression dans une autre à l'aide d'Eval Insert, Eval Expr, Parse et Substitute
Utilisation de la liste des colonnes dans les formules
Pouvez-vous le construire sans écrire l'expression sous forme de chaîne ?
Re: 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!