Ayuda para crear secuencias de comandos de una ventana interactiva que se actualiza según las elecciones del usuarioEstimados,
Estoy escribiendo un script que se implementará entre los usuarios de mi organización para realizar algunas estadísticas rápidas y sencillas para el usuario sin tener que invocar la plataforma de distribución. El script se encuentra a continuación con una captura de pantalla de lo que tengo actualmente y luego una lista de las cosas con las que tengo problemas. Los usuarios ejecutarán JMP 16.1, yo estoy ejecutando JMP Pro 16.0. Todas las máquinas son máquinas con Windows 10 y 64 bits.
El propósito previsto del script es mostrar las columnas numéricas (tal vez más adelante me ocupe de las columnas categóricas) y, dependiendo del botón de opción seleccionado, realizará algunas estadísticas simples y mostrará los resultados en la misma ventana con una columna denominada Estadísticas. para el tipo de estadística calculada y Valores para los resultados de dichos cálculos. El cuadro del panel Resultados debería actualizarse al seleccionar el botón de opción después de haber seleccionado la columna apropiada en el cuadro del panel Seleccionar columna.
Script JMP actual (para su información, lo estoy probando en el conocido archivo Big Class.jmp):
Names Default To Here( 1 );
//Clear Symbols();
//the width of the column list box in pixels
lbWidth = 100;
dt = Current Data Table();
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
StatsListC = {};
//Expression to do math
MathA = Expr(
response_col = Column( dt, Eval( Eval Expr( Expr( ycols ) ) ) );
ymean = Col Mean( response_col );
ystdev = Col Std Dev( response_col );
ymin = Col Min( response_col );
ymax = Col Max( response_col );
yrange = ymax - ymin;
yN = Col Number( response_col );
NumResultsA = {ymean, ystdev, ymin, ymax, yrange, yN};
);
//Expresseion for other math
MathB = Expr(
);
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Esto es lo que tengo hasta ahora:

Aquí está la lista de cosas con las que tengo problemas:
- La llamada a Radio Box() enumera el nombre de la variable local "StatsListA", etc. en lugar de enumerar las estadísticas que se calcularán. Por ejemplo, el primer botón de opción debería tener la siguiente lista detrás: Media, Desv. estándar, Máx., Mín., Rango, N. Esto también debería ser para StatsListB y StatsListC (todavía no he definido la lista C). No estoy seguro de cómo hacer que evalúe la lista predefinida que hago en la parte superior del código JSL. Preferiría no tener que escribir todos y cada uno de los elementos, ya que es posible que desee cambiar los elementos de la lista y es más fácil cambiar la variable local StatsListX en lugar de editar la llamada de Radio Box() cada vez.
- En este momento, preferiría no enumerar TODAS las columnas, sino solo numéricas. Cuando cambio la opción en Col List Box() de Todo a Numérico (con o sin ""), obtengo una lista vacía de columnas. No puedo entender por qué sucede esto, cuando debería enumerar solo las columnas numéricas cuando tengo esa opción definida.
- Creo que este es el más difícil: como mencioné antes, me gustaría que los resultados en el cuadro "Resultados" del Panel se actualicen con una columna a la izquierda "Estadísticas" (que enumera las estadísticas de StatsListX y los resultados de los cálculos para esas estadísticas en la columna de la derecha "Valores". Esto debe actualizarse con cada clic de un botón de opción. Entonces, si originalmente estaba mirando :height, pero quería mirar :weight, seleccionaría :weight y luego haría clic en uno de los botones de opción para obtener el resumen estadístico relevante. Intenté seguir el ejemplo de Set Function que se muestra aquí, pero no lo logré (no conozco muy bien la llamada a Set Function).

Se pretendía llamar a Expr() para MathA cerrando la ventana original y abriendo una nueva con los resultados, pero después de investigar un poco más en las discusiones de JMP, descubrí que se pueden actualizar campos dentro de una ventana existente, lo que Así es como prefiero abordar este problema. Entonces, sé que la codificación original en la parte superior de mi código no es el código correcto para lo que pretendo hacer.
Cualquier ayuda sobre esto es muy apreciada.
¡Gracias!,
DS
Ingeniería de Calidad y ProcesosRe: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioEsto es tan genial. Gracias por esta discusión.
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioHola a todos,
Me gustaría agradecerle por los cambios sugeridos en curso. He realizado algunos cambios en el script y me gusta más la última versión modificada, por lo que realmente aprecio las contribuciones de los demás. El script actualizado se publicará al final de esta respuesta. Este nuevo script también proporciona estadísticas resumidas para los tipos de datos de caracteres. También modifiqué ligeramente la disposición de los paneles.
@jthi , Creo que tus sugerencias fueron muy buenas y las he incorporado. Me gustan los nombres de los encabezados de colores para las estadísticas de resultados. Además, similar a lo que @ataqueerrático tenía en su código, lo hice para que las estadísticas se actualizaran al seleccionar una nueva columna O seleccionar un nuevo resultado numérico. Permití que los resultados de las estadísticas del personaje cambiaran su tamaño vertical porque podría haber muchos niveles, como para la tabla de datos Big Class.jmp. Las estadísticas categóricas también se actualizarán al cambiar a ese tipo de columna, pero generarán un error si se selecciona la columna de personaje y luego alguien hace clic en una opción de estadística numérica. Mantuve la sugerencia de ancho para que la ventana no siguiera cambiando el tamaño del ancho. Lo siento @ataqueerrático , No estoy muy familiarizado en este momento con la definición de nuevos espacios de nombres y cómo modificaste el código. Parece muy útil y una buena forma de abordar las cosas, sólo necesito aprender a hacerlo correctamente.
Estoy seguro de que existen otras sugerencias sobre cómo mejorar esto, especialmente la estética. Si es así, publíquelo, pero asegúrese de etiquetarme para saber que ha habido una actualización de esta discusión. Gracias de nuevo a todos por las mejoras sugeridas.
¡Gracias!,
DS
a continuación
//GUI for quickly reporting statistics written by D. Schmidt, ver1.5
//Thanks to JMP User community members: jthi, ian_jmp, and ErraticAttach for helpful suggested changes.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 217;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"µ", "σ", "Max", "Min", "Range(Δ)", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N 0", "Prop 0", "Prop non-0"};
maxStatCount = Max( N Items( StatsList1 ), N Items( StatsList2 ), N Items( StatsList3 ) );
//RadioBox() arguments
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
rbcArg = {"Select for categorical columns"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
CatStats = Expr(
coltype = tempCol << Get Data type;
If( coltype == "Character",
catdist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_catdist = catdist << Report;
lvl = rpt_catdist[String Col Box( 1 )] << Get;
Count = rpt_catdist[Number Col Box( 1 )] << Get;
Prob = rpt_catdist[Number Col Box( 2 )] << Get;
SummNMiss = rpt_catdist[List Box( 7 )][2] << Get Text;
SummLvl = rpt_catdist[List Box( 8 )][1] << Get text;
numNMiss = Num( SummNMiss );
numLvl = Num( SummLvl );
catdist << Close Window;
);
Insert Into( lvl, {"N Missing", "N Levels"} );
Insert Into( Count, numNMiss );
Insert Into( Count, numLvl );
);
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioHola @jimloughlin ,
Creo que fue sólo un código de depuración que @jthi estaba usando al proporcionar las ediciones sugeridas a mi código original que publiqué. Estoy publicando uno actualizado que tiene en cuenta algunas ediciones sugeridas por otras personas que escribieron en este hilo. Te etiquetaré cuando publique el script actualizado. Lo tengo funcionando bien con la tabla de datos Big Class.jmp.
¡Gracias!,
DS
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioPoniendo mi granito de arena aquí.A menudo es mejor separar el script tanto como sea posible en unidades o funciones lógicamente aisladas.Con ese fin, me parece mucho mejor eliminar la lógica del árbol de visualización y aplanar las definiciones de funciones tanto como sea posible.
En mi solución de ejemplo a continuación, verá que todas las funciones tienen como alcance el ser espacio de nombres y que la primera línea de cada función abarca el ser espacio de nombres.En la práctica, lo que he hecho es crear un contenedor de metaprogramación que hace esto automáticamente, de modo que no tenga que definir explícitamente el ser espacio de nombres o incluir el self = Espacio de nombres( "nombre") línea como primer argumento de cada función.Si crea muchas GUI interactivas, es posible que desee hacer algo similar, ya que ahorra una gran cantidad de trabajo.Esto también tiene la ventaja de no tener que envolver el script en un Evaluación( Evaluación Expr( "<CÓDIGO>" ) )</CÓDIGO> bloquear.
Además, si sigue esta ruta, me resulta más fácil producir un contenedor para los cuadros de visualización integrados que pueda llamar directamente al ser funciones y no tener la necesidad de poner tanta repetitiva dentro del << Establecer función() mensajes.
/* quick stats */
self = New Namespace();
self:tool name = "Quick Stats";
Eval( Eval Expr(
self:initialize = Function( {}, // called before the display tree is generated
self = Namespace( Expr( self << Get Name ) );
self:table = Current Data Table();
self:radio inputs = {
"Mean, Std Dev, Max, Min, Range, N",
"Quantiles: 0.05, 0.25, 0.50, 0.75, 0.95",
"N, N Missing, N Zero, Prop 0, Prop non-0"
};
self:stat list = {
{"Mean", "Std Dev", "Max", "Min", "Range", "N"},
{"5%", "25%", "50%", "75%", "95%"},
{"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"}
};
1
);
self:content = Function( {}, // holds the display tree
self = Namespace( Expr( self << Get Name ) );
self:container = H Splitter Box(
V List Box(
H List Box(
Lineup Box( N Col( 1 ), Spacing( 0 ),
Spacer Box( <<SET auto="" stretching=""></SET>self:window << Update Window;
self:finalize();
) );
self << Get Name;
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioCuando ejecuto statsstart.jcl, aparece el siguiente error:
Nombre sin resolver: tempCol{1} en el acceso o evaluación de 'tempCol', tempCol/*###*/
¿Quizás porque estoy ejecutando v13.2.1?
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioDespués de que el script funcione principalmente como desea, hay un par de cosas visuales que consideraría:
- El tamaño de la tabla cambia y hace que la ventana "rebote" un poco
- Si el usuario no tiene ninguna columna seleccionada, habrá un error.
- Si no hay tablas de datos abiertas, puede detener la ejecución del script e informar al usuario.
- Si el usuario cambia la columna en el cuadro de lista de columnas, tal vez debería volver a calcular las estadísticas con la selección actual de Radio Box O dejar la tabla vacía.
Un par de ideas:
- Para el cuadro del panel Resultados. Puede usar Establecer anchos para evitar que la tabla cambie el tamaño horizontal y el marcador de posición oculto String Col Box con un tamaño de lista predefinido para evitar cambios de tamaño vertical.
- Seleccione el cuadro del panel Columnas. Puede agregar Max Selected(1) para evitar que el usuario seleccione varias columnas.
- Elija el cuadro del panel Estadísticas rápidas. Algún tipo de "manejo de errores" si el usuario no tiene ninguna columna seleccionada.
Guión completo con algunas modificaciones:
Ver más...
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioHola @jthi y @ian_jmp ,
¡Gracias a ambos por su gran ayuda! Gracias por los dos últimos consejos finales. @jthi , Pude superar el "problema" alfabético de la matriz asociativa. Me gusta el poder de los AA, puedo ver dónde pueden resultar útiles, pero necesito que se mantenga un cierto orden debido a los usuarios.
Pude hacer los cambios con la sugerencia de listas y tu sugerencia para el problema de Count Zero que tuve. ¡Gracias! El código funciona como se esperaba, ahora tendré que expandirlo para crear columnas categóricas y luego encuestar a mis usuarios para ver qué lista real de estadísticas necesitan.
¡Gracias, de nuevo, por toda su ayuda! El código de trabajo (al menos para las columnas numéricas) se encuentra a continuación.
¡Gracias!,
DS
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuario1. Debido al uso de Associative Array, las estadísticas se reordenarán. Quizás podrías simplemente usar listas y modificar las referencias para usar índices.
2. Modificar la forma en que se calculan los valores 0 podría funcionar. Por ejemplo, podría utilizar el ejemplo Loc() con N Items():
statZero = Expr(N Items(Loc(tempCol << get as matrix, 0)));

Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioHola @jthi y @ian_jmp ,
¡Muchas gracias a los dos por los rápidos comentarios! Tus sugerencias funcionaron muy bien y pude progresar mucho más. Ahora tengo problemas con solo dos cosas probablemente muy simples. Incluyo el código actualizado a continuación. Para su información, eliminé algunos valores en :height y agregué algunos ceros en :height para probarlo.
Asuntos:
- Cuando lista las estadísticas las hace por orden alfabético, me gustaría mantener el orden que tengo definido en mis listas, ¿es posible?
- Estoy tratando de calcular la proporción cero y distinta de cero contando primero el número de ceros. Desafortunadamente, no está funcionando del todo bien. Puedo poner el resumen dentro de Expr(), pero luego no puedo definir la matriz asociativa y no obtengo los cálculos posteriores correctos. Estoy seguro de que hay una manera más sencilla de hacer esto, pero no pude encontrar ningún comando directo en JSL para contar solo ceros. Ingresé 5 valores faltantes y 7 valores cero manualmente. Entonces, la propiedad distinta de cero debería ser 0,8 y la propiedad cero debería ser 0,2.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsListC = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsListA, ", " ), Concat Items( StatsListB, ", " ), Concat Items( StatsListC, ", " )} );
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);<BR /><BR />//Here's where I'm having trouble with the N Zero and proportions zero and non-zero.
Expr(
Summarize( dt, eg = By( tempCol ), em = Count( tempCol ) )
);
PropTemp1 = Expr(
Associative Array( eg, em )
);
statZero = Expr( PropTemp1["0"] );
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
maths = Associative Array();
maths["StatListA"] = Associative Array( StatsListA, {statMean, statStd, statMax, statMin, statRange, statN} );
maths["StatListB"] = Associative Array( StatsListB, {., statQ95, statQ75, statQ50, statQ25, statQ5} );
maths["StatListC"] = Associative Array( StatsListC, {statN, statMiss, statZero, statProp0, statPropn0} );
rbOptions = maths << Get Keys;
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Gracias de nuevo por tu ayuda hasta ahora y espero que puedas ayudar con estas otras pequeñas cosas.
¡Gracias!,
DS
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioRespecto al punto 1., y añadiendo sólo un poco a la respuesta de @jthi , tu puedes hacer:
Names Default To Here( 1 );
//the width of the column list box in pixels
lbWidth = 100;
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
//RadioBox() argument
rbArg = EvalList({ConcatItems(StatsListA, ", "), ConcatItems(StatsListB, ", ")});
//Window
New Window( "GUI for quick stats",
Panel Box( "Select Columns", ColListData = Col List Box( dt, all, <<SET data="https://community.jmp.com/" type=""></SET>
Re: Ayuda para crear scripts en una ventana interactiva que se actualiza según las elecciones del usuarioHice algunas pruebas rápidas y adjunté el script. Tiene posibles ideas sobre cómo abordar esto, pero es posible que no sean las mejores soluciones.
1. Manejado con Arrays y Expresiones Asociativas.
2. Tuve que usar una sintaxis extraña para esto ColListData = Col List Box(dt, All, <
3. Set Function se encarga de esto con Evals.
El guión adjunto dará una mejor idea de cómo abordé esto por ahora.
