Nueva fórmula de columna con JSLEstoy tratando de agregar una nueva fórmula de columna a una tabla basada en la entrada del usuario. La entrada puede ser un valor único o una selección de columna.
He estado probando un par de métodos, pero no pude conseguir uno que pudiera manejar esto indistintamente.
Ejemplo de secuencia de comandos que probé a continuación.
Idealmente, puedo mantener la expresión "newcolexpr" igual independientemente de la entrada. Esto se debe principalmente a que estoy tratando de implementar una columna de fórmula personalizada que requiere muchas entradas (es decir,> 8 entradas)
Agradezco la ayuda.
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: nueva fórmula de columna con JSLLo más probable es que tenga que verificar la entrada y luego crear una columna basada en eso (puede verificar dentro de Expr en la fórmula, pero es más claro de esta manera). A continuación se muestra una opción:
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: nueva fórmula de columna con JSLOye @jthi Gracias por la respuesta. También estaba pensando así, pero ¿qué pasa si tengo más de 1 variable para considerar en la fórmula? ¿Será anidado-if la única solución allí (realmente estoy tratando de evitar eso)?
Me pregunto si la sintaxis puede manejar una variable dentro de expr () para poder asignar un número o NameExpr (asColumn ()) según el tipo de entrada antes de sustituirlo en la expresión.
Re: nueva fórmula de columna con JSLLos enfoques sobre cómo abordar esto dependen mucho de las variables, entradas y fórmulas que tenga.
Otro ejemplo:
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));
Algunos enlaces:
Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute
Usando lista de columnas en fórmulas
¿Puedes construir esto sin escribir una expresión como una cadena?
Re: nueva fórmula de columna con JSLLo siento por la respuesta tardía. Gracias @jthi !
Descubrí que lo siguiente funciona para lo que quiero hacer:
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))Sin embargo, gracias por toda la referencia anterior. Ellos ayudaron.
¡Feliz año nuevo!