Hola. Tengo algunos problemas para modificar algunas opciones de la plataforma de distribución en JSL (por ejemplo, gráfico de caja de valores atípicos, gráfico de cuantiles normales, etc.). Estoy escribiendo un script que permitiría a los usuarios crear distribuciones para una lista arbitraria de columnas. Además, me gustaría darle al usuario la posibilidad de especificar si las gráficas de caja de valores atípicos o las gráficas de cuantiles normales están habilitadas para todas las gráficas. Sin embargo, tengo algunos problemas y espero que alguien pueda ofrecer alguna idea.
Para que conste, estoy ejecutando JMP Pro 14.3.0 en una Mac.
Primero probé esto:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
tcol_lis = {"height", "weight"};
//First approach
nqplopt = 1; //This is meant to turn on the Normal Quantile Plot option
Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt),
);
nqplopt = 0; //But it has no effect
Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt),
);Parece que debería haber funcionado, pero establecer "nqplopt" en 1 o 0 no tiene ningún efecto. En mi caso, el gráfico de cuantiles se generó en ambas ocasiones. Interesante ya que esa opción está desactivada en mis preferencias.
A continuación, intenté enviar un mensaje a la distribución después de la creación.
//Second approach - send the Normal Quantile option as a message
nqplopt = 1;
dist = Distribution(
Column(EvalList(tcol_lis))
);
dist << Normal Quantile Plot(nqplopt);
nqplopt = 0;
dist = Distribution(
Column(EvalList(tcol_lis))
);
dist << Normal Quantile Plot(nqplopt); //No difference from when nqplopt = 1
Como antes, no hay diferencia cuando nqplopt es 1 o 0. Dudo que esto funcione para mí de todos modos, ya que el objeto "dist" se refiere a múltiples distribuciones y no estoy seguro de cómo JSL manejaría el envío de un mensaje a eso.
Por último, fui a mi solución preferida, forcé las sustituciones que quiero usando una cita de JSL:
//Third approach - make substitutions via JSL Quote
nqplopt = 0;
dist_jst = JSL Quote(
Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt_ph),
);
);
SubstituteInto(dist_jst,
Expr(nqplopt_ph), nqplopt
);
Show(dist_jst); //The "nqplopt_ph" remains unchanged for some reason.
Eval(Parse(dist_jst)); //Dist. created with a Normal Quantile Plot, as if nqplopt = 1
Aún así, como un crupier sin trabajo, sin dados. Cuando muestro la cadena dist_jst modificada, es como si nunca se hubiera emitido el comando SubstituteInto. Tengo curiosidad ¿Por qué es esto? He usado JSL Quote antes muchas veces, pero no puedo entender por qué parece que no puede hacer esta modificación.
¿Alguna idea o solución?
@nikles ,
Felicitaciones por encontrar una solución que funcione para usted.A continuación se muestra una alternativa.
EvalExpr() reemplaza cada Expr(variable) con su valor y devuelve una expresión con valores.Así que Eval( EvalExpr() ) reemplaza las variables con valores y ejecuta la expresión resultante.Tenga en cuenta que agregué y comenté Ignorar preferencias de plataforma (1). Si un usuario tiene preferencias diferentes a las del programador, es posible que el informe no sea el mismo. Ignorar preferencias de plataforma(1) desactiva todas las preferencias para este análisis, por lo que el programador debe especificar todo lo que debería estar visible.Sin embargo, garantiza que el usuario verá el mismo análisis que otros usuarios.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
tcol_lis = {"height", "weight"};
//First approach
nqplopt = 1; //This is meant to turn on the Normal Quantile Plot option
Eval(EvalExpr(Distribution( //Ignore Platform Preferences(1),
Column( EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt),
)));
nqplopt = 0; //But it has no effect
Eval( Eval Expr(Distribution(//Ignore Platform Preferences(1),
Column(EvalList(tcol_lis)),
Normal Quantile Plot(Expr(nqplopt)),
)) );
Bueno... es posible que haya encontrado una respuesta a mi propia pregunta. Todavía tengo curiosidad por qué la ruta JSL Quote no funcionó, pero la solución que adopté fue usar una cadena literal entre comillas en su lugar. Como se muestra aquí:
//Fourth approach - make substitutions via a literal string quote
nqplopt = 0;
dist_str =
"Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt_ph),
)";
SubstituteInto(dist_str,
"nqplopt_ph", Char(nqplopt)
);
Show(dist_str); //The "nqplopt_ph" is successfully changed to 0.
Eval(Parse(dist_jst)); //Finally, it works.
Me dijeron que esto generalmente no se considera una "buena práctica" (poner todo el comando entre comillas), pero bueno... funciona.