Algunas ideas sobre las fórmulas de columnas dinámicasComo principiante en JSL, a menudo me cuesta interpretar los scripts. Si encuentro un script en una discusión que parece solucionar mi problema e intento personalizarlo, a menudo lo rompo y me cuesta entender cómo solucionarlo. Durante mi trayectoria en el mundo de los scripts en JSL, he recurrido en gran medida a este foro para obtener ayuda, tanto para buscar respuestas anteriores en los extensos archivos como para pedir ayuda si las respuestas no son evidentes. Este foro es un recurso invaluable para aprender JSL y la profundidad de los conocimientos que se encuentran aquí y la disposición a compartirlos son sorprendentes.
Recientemente, he estado jugando con fórmulas de columnas dinámicas y encontré una publicación muy útil de hace unos años aquí . La solución de @txnelson y la sugerencia de seguimiento de @NisKorsgaard me resultaron bastante reveladoras. Como soy tan nuevo en JSL, a menudo me gusta "descomprimir" el código para averiguar qué hace cada parte. Hice esto para el problema de la fórmula de columna dinámica que tenía. El ejercicio fue muy útil para mí y pensé que también podría serlo para otros, así que he incluido el código "descomprimido" a continuación.
El script no hace nada práctico, pero proporciona un ejemplo simple de cómo se pueden cambiar dinámicamente las fórmulas de columna. Espero que a alguien le resulte útil.
// CALL COLUMN BY REFERRING TO VARIABLE
// See this Discussion for more info:
// From: https://community.jmp.com/t5/Discussions/call-a-column-by-referring-to-variable/td-p/272339
// Original script from @txnelson
//Names Default To Here( 1 );
//dt = Open( "$SAMPLE_DATA/big class.jmp" );
//columnname1 = Column( dt, 4 ) << Get Name;
//columnname2 = Column( dt, 5 ) << Get Name;
//
//Eval(
// Substitute(
// Expr(
// dt << New Column( "new_" || columnname1,
// Numeric,
// continuous,
// formula( __c1__ + __c2__ )
// )
// ),
// Expr( __c1__ ), Parse( ":" || columnname1 ),
// Expr( __c2__ ), Parse( ":" || columnname2 )
// )
//);
// ==================================================
// REVISED SCRIPT
// Pulls apart the above script a bit. For me, this was easier to visualize
// and understand. Also helped clarify how variables work and why the
// EVAL EXPR function is needed. When running script look at the log for changing
// variable contents.
// SETUP
// **************************************************
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnName1 = Column( dt, 4 ) << Get Name;
columnName2 = Column( dt, 5 ) << Get Name;
// FORMULA WITH PLACEHOLDERS
// Create expression with desired formula using placeholders for each variable and store result in var.
// **************************************************
var = Expr(
dt << New Column( "new_" || columnName1, Formula( __c1__ + __c2__ ) )
);
Show (var); // For learning and debugging. Look in log for value of var.
// SWAP OUT PLACEHOLDERS FOR COLUMN NAME STORED IN VARIABLES
// Replace placeholders with variable contents, make them column names and store result in subVar.
// To see the effect of EVAL EXPR, try substituting EVAL (remove EXPR) and re-running the script.
// Look at the log.
// **************************************************
subVar = Substitute(
Eval Expr( var ),
Expr( __c1__ ), As Name( columnName1 ),
Expr( __c2__ ), As Name( columnName2 )
);
Show( subVar); // For learning and debugging. Look in log for value of subVar.
// DO IT
// Make the column with the new formula.
// **************************************************
Eval( subVar );
Automatización y scriptingRe: Algunas ideas sobre fórmulas de columnas dinámicasEsta es una publicación un poco antigua, pero es un buen punto de partida . Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute . Cuando tenga tiempo suficiente, escribiré mi opinión sobre estas expresiones y su manejo en algunos casos diferentes en una publicación de blog.
Re: Algunas ideas sobre fórmulas de columnas dinámicas@jthi , gracias por este curso introductorio sobre los conceptos básicos del manejo de expresiones:
Sesión 9: JSL avanzado 33min - ...
Otra gran conferencia:
Uso de JSL para desarrollar aplicaciones eficientes y robustas (EU 2018 415)
Eval(Substitute()) es una de las pocas herramientas que debes llevar contigo como una navaja suiza para crear scripts JSL : )
Manejo de expresiones en JMP: trucos y trampas
Re: Algunas ideas sobre fórmulas de columnas dinámicasEn lugar de almacenar los nombres de las columnas como cadenas y convertirlos en "nombres" mediante as name , también se pueden almacenar los nombres (con o sin ":") y recuperarlos y conservarlos mediante Name Expr :
dt = Open( "$SAMPLE_DATA/big class.jmp" );
col1 = Name Expr(:height);
col2 = Name Expr(:weight);
new name = "new_" || (col1 << get name);
col1 << set name("tmp"); // we don't care - the reference will still point to the right column
var = Expr(
dt << New Column( new name , Formula( __c1__ + __c2__ ) )
);
var = Substitute( Name Expr(var),
Expr( __c1__ ), Name Expr( col1 ),
Expr( __c2__ ), Name Expr( col2 )
);
/*alternative:
Substitute Into( var,
Expr( __c1__ ), Name Expr( col1 ),
Expr( __c2__ ), Name Expr( col2 )
);*/
Eval( var );