cómo pasar una columna como parámetro en una fórmulaHola,
Estoy tratando de crear una fórmula simple en columnas que se almacenan como variables en una lista.
No entiendo por qué JSL se niega a realizar la fórmula.
Si cambio en la fórmula el parámetro por la cadena que almacena, funciona perfectamente.
Alguna ayuda ??
Aquí está el código que uso:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
for(j=1, j <= N items(MyList), j++,
dt << New Column( ParamPlot[j], Formula( 2* ParamPlot[j]) );
);
Probé cosas como Eval, Eval expr,... pero de ninguna manera 
Re: como pasar una columna como parametro en una formulaCorto y eficiente 
Muchas gracias 
Re: como pasar una columna como parametro en una formulaNo pude resistirme a una última toma. Corto y dulce y funciona. Utilizar Evalinsert para evaluar variables, :nombre() para referirse a columnas, "\[ ]\" para permitir comillas dobles dentro de una cadena, y finalmente usar evaluar(analizar()) para ejecutar la cadena resultante.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
new_col_expr = evalinsert("\[dt << New Column("^paramplot[j]^", Formula(2 * :name("^mylist[j]^")))]\");
eval(parse(new_col_expr));
);Re: como pasar una columna como parametro en una formulaAnte todo gracias a todos por vuestras respuestas...
Aquí está mi opinión sobre todas las soluciones propuestas:
1/ La solución propuesta por Mark: funciona perfectamente (aunque es difícil de leer cuando no se está acostumbrado a evaluar, analizar, sustituir,...).
2/ La solución propuesta por Jan: Efectivamente, mejor a los ojos (también usa eval, replaceinto,...). Por cierto funciona perfectamente.
3/ La Solución de Byron: También usa Eval, replace, expr...Funciona perfectamente
4/ La solución de pmroz es, con mucho, la más simple (a simple vista), pero la fórmula que obtenemos todavía hace referencia a MyList y no a las columnas que deberían representar... Lo que significa que si cambio un valor en la columna "edad " , la columna "age2" no se actualizará.
Gracias por todas las sugerencias 
Re: como pasar una columna como parametro en una formulaComo dijo Byron, está tratando de crear una nueva columna que sea 2 veces ella misma. Creo que esto es lo que quieres. COMO COLUMNA hizo el truco.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
dt << New Column( ParamPlot[j], Formula( 2 * as column(dt, MyList[j]) ) )
);
Esto funciona muy bien siempre que no agregue filas. Entonces necesitarás las evaluaciones, exprs, etc.
Re: como pasar una columna como parametro en una formulaparece que está tratando de crear una fórmula que se multiplique a sí misma por 2. Esto no funcionará y debería devolver un valor vacío.
Además, "j" es una función para hacer matrices (tenga en cuenta que se vuelve azul en el editor JSL), por lo que generalmente evito usar "j" como variable en caso de que se interprete de forma inesperada.
Trabajar con nombres de columnas y referencias puede ser bastante frustrante. Echa un vistazo a esta estrategia.
Dentro del bucle, primero se crea la columna y, a medida que se crea, se le asigna un identificador "newcol" para usar como referencia. Luego está la gran cláusula eval(substitute)). Dentro de este argumento, la "col<
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( i = 1, i <= N Items( MyList ), i++,
newcol=dt << New Column( ParamPlot[i] );
Eval(
Substitute(
Expr(
newcol << set formula( a * 2 ) ) ,
Expr( a ), As Name( mylist[i] )
);
));Re: como pasar una columna como parametro en una formulaTal vez esto es un poco mejor (a los ojos de algunos):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
CMD = Expr(dt << New Column( NameTBD, Formula( 2 * colTBD) ));
SubstituteInto(CMD, Expr(NameTBD), ParamPlot[j], Expr(ColTBD), Parse(":"||MyList[j]));
CMD;
);
Re: como pasar una columna como parametro en una formulaEl problema es que el argumento de Formula() se trata como una expresión literal. No evalúa ParamPlot[j] y sustituye el resultado para hacer la fórmula que desea. Parece que debería poder usar expresiones, pero no llegué a ningún lado con ese enfoque, así que aquí hay una solución basada en cadenas de caracteres:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
Eval(
Parse(
Substitute("dt << New Column( \!"nnn\!", Formula( 2 * :ppp ) )",
"nnn",
ParamPlot[j],
"ppp",
MyList[j]
)
);
);
);
Realmente no me gusta usar cadenas de caracteres, pero a veces, tienes que hacer lo que tienes que hacer.