Solicitar al usuario que seleccione columnas es una tarea muy común en un script de JMP . Al preparar tu script, hay algunos aspectos a considerar que te ayudarán a decidir qué método es la mejor opción.
Para empezar, piensa en cómo quieres que se vea la ventana. Además de seleccionar columnas, ¿debería permitir al usuario especificar otras opciones? Y lo más importante, ¿cómo quieres que se comporte la ventana?
Ventanas modales frente a ventanas no modales
Una ventana modal detendrá la ejecución del script y esperará la interacción del usuario. Una vez que el usuario interactúe con la ventana y la cierre, se ejecutará el resto del script. Un ejemplo de ventana modal es la ventana de Preferencias (Archivo > Preferencias). JMP no realizará ninguna otra acción hasta que se cierre la ventana de Preferencias.
Con una ventana no modal, esta permanece abierta y permite que el script se complete sin necesidad de interacción del usuario. Piense en la ventana de inicio de la plataforma Ajustar modelo (Analizar > Ajustar modelo). Observe que puede dejar la ventana abierta y realizar otras tareas en JMP. Incluso hay una casilla de verificación para mantener el cuadro de diálogo abierto después de crear el análisis. Este es un ejemplo de una ventana no modal. Puede optar por usar una ventana no modal que permanezca abierta para que el usuario pueda seleccionar columnas y roles diferentes.
¿Cómo decidir si usar una ventana modal o no modal? La principal consideración es si se desea que JMP espere la entrada del usuario o no. Si el resto del script depende de las selecciones del usuario, entonces conviene usar una ventana modal. Dado que existen dos métodos útiles para crear ventanas modales, exploremos las opciones.
Cuadro de diálogo de columna()
La función Column Dialog() permite generar rápidamente un cuadro de diálogo modal para que los usuarios seleccionen columnas de la tabla de datos actual. El autor del script simplemente selecciona los tipos de cuadros de visualización que se mostrarán en el cuadro de diálogo, pero tiene poco control sobre el diseño. A continuación, se muestra un ejemplo de script que solicita al usuario que seleccione dos columnas X y dos columnas Y.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
dlg = Column Dialog(
yList = Col List( "Y",
Min Col( 2 ),
Max Col( 2 ),
Data Type( "Numeric" )
),
effectList = Col List( "Effects",
Min Col( 2 ),
Max Col( 3 ),
Data Type( "Numeric" )
)
);
La ventana que se muestra al usuario tiene este aspecto:

Observe que el autor del script solo proporcionó las opciones para los dos cuadros de visualización de la lista de columnas. La lista de columnas de la tabla de datos actual, que se muestra a la izquierda, se proporciona como parte de la funcionalidad integrada.
Después de que el usuario realiza sus selecciones y hace clic en aceptar, el resultado es una lista de las opciones del usuario, como por ejemplo:
dlg = {yList = {:Age, :Oxy}, effectList = {:RunPulse, :RstPulse}, Button(1)};
Las expresiones individuales de la lista no se evalúan. Por lo tanto, para usar las columnas seleccionadas, puede descargar la lista de columnas para usarla en su análisis de varias maneras. Por ejemplo, puede indexar la variable de lista dlg y asignar la lista de columnas a una nueva variable, o puede usar el mismo nombre:
yList = dlg["yList"];
effectList = dlg["effectList"];
Otro método para descargar la lista de columnas es usar Eval List() para evaluar los elementos de la variable de lista dlg. El último elemento de la lista dlg se elimina antes de evaluar los demás elementos de la lista porque Botón(1) no necesita ninguna evaluación.
Eval List( Remove( dlg, -1 ) )
Ahora, si ejecuta Mostrar símbolos (); verá todas las variables definidas y que las selecciones de columna se almacenan en las variables yList y effectList.
// Here
dlg = {yList = {:Age, :Oxy}, effectList = {:RunPulse, :RstPulse}, Button( 1 )};
dt = Data Table( "Fitness" );
effectList = {:RunPulse, :RstPulse};
yList = {:Age, :Oxy};
// 4 Here
Cualquiera de los métodos que elija para descargar los valores le permitirá utilizar las variables yList y effectList en su análisis:
fm = dt << Fit Model(
Y( Eval( yList ) ),
Effects( Eval( effectList ) ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run
);
¿Cuáles son, entonces, las principales consideraciones para usar Column Dialog()?
- Siempre está presente un selector de columnas de la tabla de datos actual. Si bien esto resulta útil cuando se desea que el usuario seleccione columnas, limita el uso de este tipo de ventana modal.
- La cantidad de código que debes escribir es bastante corta. Es posible que la funcionalidad integrada satisfaga completamente tus necesidades. Sin embargo, la capacidad de personalización es limitada. Por ejemplo, solo hay tres constructores para controlar la disposición de los cuadros de visualización dentro de la ventana: HList(), VList() y Line Up Box().
- El valor que devuelve Column Dialog() es consistente. Como autor del script, sabes que Column Dialog() siempre devolverá una lista de valores que deben extraerse. La desventaja es que se requiere un paso adicional para descargar los valores y hay menos flexibilidad en cuanto a cómo se recuperan las selecciones del usuario.
Para obtener una lista completa de los constructores disponibles para Column Dialog(), consulte la sección Constructores para Column Dialogs del capítulo Árboles de visualización en la Guía de scripting .
Nueva ventana()
La función `NewWindow()` es una función integrada que permite generar una ventana modal o no modal para diversas tareas, desde solicitar al usuario que seleccione columnas hasta alertarlo con información importante. Gracias a la cantidad y variedad de cuadros de visualización disponibles, puede crear ventanas modales muy personalizadas con `NewWindow()`.
Con el aumento de las opciones de personalización, también aumenta la cantidad de código que se debe escribir. El siguiente ejemplo muestra una ventana similar al cuadro de diálogo Column Dialog() que se muestra arriba. Observe que algunos de los cuadros de visualización tienen nombres similares. Por ejemplo, V List Box(), H List Box(), Panel Box() y Lineup Box() se utilizan para controlar la disposición de la ventana. Los cuadros de visualización restantes son los elementos que se pueden ver en la ventana, como los botones y la lista de columnas.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
nw = New Window( "Launch Dialog",
<
<MODAL>
V List Box( Align( "right" ),
<STRONG>H List Box</STRONG>(
<STRONG>Panel Box</STRONG>( "Select Columns", clb = Filter Col Selector( dt, all ) ),
<STRONG>Panel Box</STRONG>( "Cast Selected Columns into Fit Model Roles",
<STRONG>Lineup Box</STRONG>( N Col( 2 ), Spacing( 5 ), Button Box( "Y", clbY << Append( clb << Get Selected ) ), clbY = Col List Box( "Numeric", MinItems( 2 ), MaxItems( 2 ), nlines( 3 ) ), Button Box( "Effects", clbEffects << Append( clb << Get Selected ) ), clbEffects = Col List Box( "Numeric", MinItems( 2 ), MaxItems( 3 ), nlines( 4 ) ), Button Box( "Remove", clbY << Remove Selected; clbEffects << Remove Selected; ) ) ) ),
<STRONG>H List Box</STRONG>( Button Box( "OK", yVars = clby << Get Items( "Column Reference" ); eVars = clbEffects << Get Items( "Column Reference" ); ), Button Box( "Cancel" ) ) ) );
</MODAL>
La ventana que se muestra al usuario tiene este aspecto:

Tal como está programada esta ventana de ejemplo, las columnas seleccionadas se asignan a variables JSL en el botón Aceptar. Quizás pienses que las columnas también podrían asignarse en los scripts de los botones Y y Efectos, como alternativa. Esto es cierto. Sin embargo, dado que el usuario puede arrastrar y soltar las columnas en los cuadros de lista de columnas, es posible que esos botones nunca se pulsen. Por lo tanto, el script del botón nunca se ejecutaría. Para conocer métodos alternativos, consulta la sección «Extraer valores de una ventana» del capítulo «Árboles de exhibición» en la Guía de scripting .
Al ejecutar Espectáculo ( yVars, eVars ); se mostrarán los valores en el registro (Ver > Registro):
yVars = {:Age, :Oxy};
eVars = {:RunPulse, :RstPulse};
Estas variables se pueden usar en el lanzamiento de Fit Model sin necesidad de descargarlas.
fm = dt << Fit Model(
Y( Eval( yVars ) ),
Effects( Eval( eVars ) ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run
);
No te dejes abrumar por la cantidad de código. En su lugar, veamos algunas de las opciones de personalización disponibles en esta ventana modal (New Window()). Los siguientes elementos corresponden a los números que se muestran en la imagen superior.
- La función New Window() permite asignar un título a la ventana que sea adecuado para tu proyecto de scripting. En este ejemplo, se utiliza el título simple "Launch Dialog".
- El texto que aparece encima de las agrupaciones se puede personalizar. Esto permite proporcionar al usuario una breve instrucción o descripción de la agrupación.
- El número de líneas que se muestran se puede especificar como un argumento opcional para el cuadro de lista de columnas (Col List Box()), que contiene las columnas seleccionadas. Esto permite controlar la cantidad de columnas que aparecen en el cuadro de visualización. También se puede añadir espacio adicional por motivos estéticos, como se muestra arriba.
- La lista de columnas puede provenir de cualquier tabla de datos abierta, no solo de la tabla actual. Recuerde que la función New Window() se puede usar para diversos mensajes de diálogo. Por lo tanto, mostrar la lista de columnas es opcional.
- El botón Aceptar puede tener funciones personalizadas. Además, el botón Cancelar es opcional.
New Window() tiene muchos más constructores disponibles de los que se mostraron aquí, como deslizadores, botones de radio, imágenes, gráficos, ¡y más! Para obtener una lista de los constructores disponibles para New Window(), consulte la sección Construir cuadros de visualización para New Windows del capítulo Árboles de exhibición en la Guía de scripting .
En resumen, Column Dialog() ofrece una forma rápida y sencilla de crear ventanas, pero su personalización es limitada. Por otro lado, New Window() modal ofrece una gran flexibilidad de personalización, pero requiere más tiempo y código para su creación. Sin duda, ambas opciones tienen ventajas significativas y seguramente les encontrarás utilidad. ¡Afortunadamente, tienes espacio para ambas en tu caja de herramientas!