¿Cómo asignar dinámicamente variables X o Y en Graph Builder usando JSL según condiciones?
Hola comunidad JMP,
I'm trying to build a dynamic Graph Builder report in JSL where the list of X variables is determined by certain conditions (e.g., flags like includeSite, includeWW, etc.). The goal is to flexibly add or remove columns from the X-axis based on runtime logic.
He probado varios enfoques, incluido el uso de:
X( :ColumnName )
X( Column("ColumnName") )
Expr( X(...) )
Substitute(...) and Eval(...)
Sin embargo, constantemente me encuentro con errores como:
Name Unresolved: X in access or evaluation of 'X'
Bad Argument( Column(...) )
Lo que estoy buscando es una forma confiable y correcta de:
-
Definir dinámicamente una lista de variables del eje X
-
Pass them to Graph Builder
-
Evite codificar de forma rígida el número de variables X o tener que repetir la lógica del generador
Aquí hay una versión simplificada de mi objetivo:
xVars = {};
If( includeSite, Insert Into( xVars, :Site ) );
If( includeWW, Insert Into( xVars, :WW ) );
// add remaining fixed columns...
Graph Builder(
Variables(
// <- How can I inject xVars here properly?
Y( :Measurement )
),
Elements(
Points( Y( :Measurement ) )
)
);
I want to avoid generating multiple separate graph blocks depending on each condition. Is there a supported or recommended way to dynamically build up the X() list for Graph Builder?
¡Gracias de antemano!
Automatización y scriptingAnálisis y modelado de datos básicosIngeniería de Calidad y ProcesosRe: ¿Cómo asignar dinámicamente variables X o Y en Graph Builder usando JSL según condiciones?Podrías probar primero usando << Agregar variable
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(Variables(X(:age), Y(:weight)), Elements(Points(X, Y), Smoother(X, Y)));
Wait(0.5);
gb << Add Variable({:height, Role("Y")});
Si eso no funciona, es posible que tengas que construir X como expresión y luego evaluarlo en el generador de gráficos.
Re: ¿Cómo asignar dinámicamente variables X o Y en Graph Builder usando JSL según condiciones?El uso de funciones integradas, como sugiere @jthi , es una excelente manera de abordar estos temas.
Si quieres seguir la idea original de escribir código JSL dinámicamente definiendo y combinando bloques de código JSL (="expresiones"), echa un vistazo a la publicación del blog de @Jasean ☝.
Con
Expr( X(...) )
Estás cerca, Sustituir y Evaluar son otras partes del marco.
Quizás la función más importante: Nombre Expr() . Permite acceder a la expresión almacenada en una variable (=nombre) sin evaluarla, por ejemplo, mediante
y= Expr(X( "ColumnName") );
Name Expr(y);
you will get X( "ColumnName") en lugar de

Otros recursos sobre el manejo de expresiones:
Manejo de expresiones en JMP: Consejos y trampas - Comunidad de usuarios de JMP
Club de Scripters, Sesión 9: JSL avanzado
Funciones de manejo de expresiones: Parte I - Desentrañando el enigma de Expr(), NameExpr(), Eval(), ...
Re: ¿Cómo asignar dinámicamente variables X o Y en Graph Builder usando JSL según condiciones?Entonces, con la ayuda de Expr() , Evaluar() , Sustituto() y Nombre Expr() ,
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
xVars = Expr(X);
Insert Into( xVars, Expr(:age) );
Eval(Substitute(Expr(Graph Builder(
Variables(
__xVars__,
Y( :height )
)
)
), Expr(__xVars__) , Name Expr(xVars)));
Re: ¿Cómo asignar dinámicamente variables X o Y en Graph Builder usando JSL según condiciones?En lugar de Sustituto() , prefiero usar Eval Expr() , que funciona como
"busca Expr() y evalúa el contenido antes de evaluar todo":
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
xVars = Expr( X );
Insert Into( xVars, Expr( :age ) );
Eval(
Eval Expr(
Graph Builder(
Variables( Expr( Name Expr( xVars ) ), Y( :height ) )
)
)
);
Entonces, JMP tiene que encontrar:

y evaluarlo. Tenga en cuenta el nombre Expr() . Como se explicó en la publicación anterior, esto garantiza que JMP solo busque el contenido de xVars y no lo evalúe. Tras recuperarlo e insertar el bloque en el bloque principal, todo se evalúa mediante el contenedor.

Un buen truco para comprobar qué está pasando: omita el Evaluar() adjunto y mire el registro.
Luego, JMP imprimirá la expresión "precocinada" en el registro, sin evaluarla. Esto permite al usuario revisar la expresión final y buscar errores.

Si todo es como se espera, simplemente agregue Evaluar() para evaluar la expresión.