Nuova formula per colonne con JSLSto cercando di aggiungere una nuova formula di colonna a una tabella in base all'input dell'utente. L'input può essere un singolo valore o una selezione di colonne.
Ho provato un paio di metodi ma non sono riuscito a ottenerne uno in grado di gestirlo in modo intercambiabile.
Script di esempio che ho provato di seguito.
Idealmente posso mantenere la stessa espressione "newcolexpr" indipendentemente dall'input. Ciò è principalmente dovuto al fatto che sto cercando di distribuire una colonna formula personalizzata che richiede molti input (ad esempio> 8 input)
Apprezzo l'aiuto.
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));ScriptingRe: Nuova formula di colonna con JSLMolto probabilmente dovrai controllare l'input e quindi creare una colonna basata su quello (puoi controllare all'interno della formula Espr in, ma è più chiaro in questo modo). Di seguito è riportata un'opzione:
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: Nuova formula di colonna con JSLEhi @jthi Grazie per la risposta. Anche io stavo pensando così, ma cosa succede se ho più di 1 variabile da considerare nella formula? Nested-if sarà l'unica soluzione (sto davvero cercando di evitarlo)?
Mi chiedo se la sintassi possa gestire una variabile all'interno di expr() in modo da poter assegnare un numero o NameExpr(asColumn()) in base al tipo di input prima di sostituire nell'espressione.
Re: Nuova formula di colonna con JSLGli approcci su come affrontarlo dipendono molto dalle variabili, dagli input e dalle formule che hai.
Altro esempio:
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));
Alcuni link:
Inserisci un'espressione in un'altra usando Eval Insert, Eval Expr, Parse e Substitute
Utilizzo dell'elenco di colonne nelle formule
Puoi costruirlo senza scrivere l'espressione come una stringa?
Re: Nuova formula di colonna con JSLScusa per la risposta in ritardo. Grazie @jthi !
Ho scoperto che quanto segue funziona per quello che voglio fare:
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))Grazie per tutto il riferimento sopra però. Loro hanno aiutato.
Buon anno!