Hola a todos,
Tengo dificultades con las variables que se evalúan normalmente en una Expr1() y no se evalúan correctamente en otra Expr2() que llama a la primera Expr. Tengo un código donde definí un Expr1() que genera distribuciones de columnas de interés. Tengo otra expresión más adelante, Expr2() que vuelve a llamar a Expr1(). Hay variables en Expr1() que parecen no evaluarse correctamente en Expr2().
Para un objeto visual, Expr2() genera una ventana similar a la siguiente:

La primera expresión, Expr1() es lo que genera la plataforma de distribución incluida debajo del generador de gráficos. El cuadro combinado y los cuadros de botones debajo de las distribuciones permiten al usuario cambiar entre diferentes estadísticas de ajuste, como diferentes R^2, RMSE, Mean Abs Dev, -Logliklihood, etc. Mi intención es actualizar tanto el GB como la Distribución en consecuencia. El GB se actualiza adecuadamente, pero la Distribución no. Al cambiar la estadística de ajuste a RMSE, por ejemplo, este es el resultado:

Actualiza los gráficos de Distribución, pero usa su configuración de tamaño predeterminada y no la configuración de tamaño que establecí en Expr1(). se supone que debe verse así donde los gráficos de distribución tienen el mismo tamaño que en la primera imagen:

La sección de código en Expr1() donde se generan las Distribuciones es la siguiente:
//this part gets column names to insert into Dispatch() below<BR />sfitcol1 = Column( NNYCol + NNcolshift ) << Get Name;
sfitcol2 = Column( NNYCol + 1 + NNcolshift ) << Get Name;
sfitcol3 = Column( NNYCol + 2 + NNcolshift ) << Get Name;<BR /><BR />//in this example, the results are:<BR />//"RMSE Training"<BR />//"RMSE Validation"<BR />//"RMSE Test"
<BR />//this part generates the Distributions that will be used to change my output report in Expr2()
dt_results << Distribution(
Continuous Distribution( Column( Eval( NNYCol + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 1 + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 2 + NNcolshift ) ), Quantiles( 0 ) ),
SendToReport(
Dispatch( {sfitcol1}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol1}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} )
)
);Si ejecuto Expr1() solo, funciona bien, el problema es que cuando Expr2() llama a Expr1() falla debido a que no evalúa las variables sfitcol# en Dispatch, por lo que no cambia el tamaño de FrameBox. como se supone que debe hacerlo en el código.
La sección de código en Expr2() que intercambia las distribuciones (usando solo el cuadro combinado) se encuentra a continuación:
NNycb = Combo Box(
NNylist,
<<SET></SET>
Jugar con poner la parte de Expr1() en la función del cuadro combinado y luego intentar ejecutar las variables sfitcol y luego enviarlas al informe para modificar el cuadro de marco genera este error en el registro incrustado:
No se puede encontrar el elemento "sfitcol1" en el contexto del esquema {sfitcol1}
No se puede encontrar el elemento "sfitcol1" en el contexto del esquema {sfitcol1}
No se puede encontrar el elemento "sfitcol2" en el contexto del esquema {sfitcol2}
No se puede encontrar el elemento "sfitcol2" en el contexto del esquema {sfitcol2}
No se puede encontrar el elemento "sfitcol3" en el contexto del esquema {sfitcol3}
No se puede encontrar el elemento "sfitcol3" en el contexto del esquema {sfitcol3}
Si luego ingreso manualmente el nombre de la columna, por ejemplo con el primer Envío: Enviar a informe (Envío ({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)}), entonces cambiará la caja del marco en consecuencia.

Entonces, es posible, y debería funcionar según la forma en que definí las cosas en Expr1(), pero la variable y no el valor (texto) de la variable se pasa al ejecutar cosas en Expr2(). Con la esperanza de recibir algunas sugerencias sobre cómo corregir esto. No creo que necesite usar una solución de tipo Eval(Substitute(Expr())), pero tal vez sí.
Cualquier pensamiento/idea/sugerencia es muy apreciada.
¡Gracias!,
DS
Evitaría configurar los tamaños de marco al crear las distribuciones y los cambiaría una vez creadas las distribuciones. Como está configurando cuadros de marco específicos para tamaños específicos, debería ser bastante fácil usar XPath para obtener las referencias y luego cambiar los tamaños.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Continuous Distribution(Column(:height), Quantiles(0)),
Continuous Distribution(Column(:weight), Quantiles(0))
);
wait(1); // demo purposes
rep = Report(dist);
(rep << XPath("//FrameBox[@helpKey='Distrib Histogram']")) << Frame Size(60, 100);
(rep << XPath("//FrameBox[@helpKey='Distrib Outlier Box']")) << Frame Size(30, 100);
wait(0);
dist << get xml;
Con respecto al problema al que se enfrenta, tendría que escribir un script de prueba para estar seguro, pero supongo que debería evaluar esos valores allí.
Hola @jthi ,
Gracias de nuevo por una rápida respuesta y solución a mi problema. El comando XPath es realmente genial y puedo ver con solo leer la breve entrada del Índice de secuencias de comandos que necesito leer más sobre XPath y cómo sacarle más provecho. Por cierto, ¿se ha discutido esto ya en el Scripter's Club? Si no, ese podría ser un buen tema.
De todos modos, modifiqué su código para acercarlo más a la situación que tengo entre manos y funciona bien. Vea la versión modificada a continuación, que tiene Expr2 llamando a Expr1 y luego, dentro de Expr2, está el cambio para el tamaño del marco de distribución.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Expr1 = Expr(
dist = dt << Distribution(
Continuous Distribution( Column( :height ), Quantiles( 0 ) ),
Continuous Distribution( Column( :weight ), Quantiles( 0 ) )
)
);
Expr2 = Expr(
Nwin = New Window( "Dists", Outline Box( "Results", Expr1 ) );
Wait( 1 ); // demo purposes
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
);
Expr2;
Una cosa a tener en cuenta para cualquiera que no sepa esto es que no puede tener la parte XPath del código dentro del objeto New Window().
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
Esa parte del código tiene que estar fuera de la Nueva Ventana. En mi caso particular, descubrí que necesitaba incluirlo como parte de la función cuando se presiona el cuadro combinado o los botones Anterior/Siguiente, de lo contrario cambia el tamaño de las Distribuciones a su tamaño original. Por ejemplo, para la opción Cuadro combinado, se ve así:
NNycb = Combo Box(
NNylist,
<<SET></SET>
Hay un breve momento en el que las distribuciones cambian de tamaño a su valor predeterminado cuando se anteponen por primera vez a la ventana, pero luego cambian de tamaño correctamente muy rápidamente.
Gracias de nuevo por la ayuda y siempre agradezco aprender cosas nuevas en el foro de discusión de JMP.
¡Gracias!,
DS
Creo que cubrí XPath muy brevemente en la sesión 7 (capa de informe), pero creo que acceder y atravesar la capa de informe es un buen tema para otra sesión más larga. XPath es básicamente su propio lenguaje y una de las habilidades que se traduce directamente de JSL a otros lenguajes de programación (regex es otro ejemplo) Tutorial XPath (w3schools.com) . Al acceder a la capa de informe en JMP usando << XPath, puede obtener fácilmente una lista de referencias y puedes enviar mensajes a la lista lo que la hace muy útil. Puede crear "rutas" sólidas (básicamente obtener referencias) a diferentes cuadros de visualización cuando combina << Obtener XML con << XPath.