¿Cómo evitar que Run in Fit Model produzca un informe?Estoy escribiendo un script que hace lo siguiente:
- Abre una ventana Ajustar modelo,
- Permite al usuario completarlo usando las macros y otras funciones en la ventana Ajustar modelo.
- Permite al usuario hacer clic en Ejecutar, momento en el cual se realiza un cálculo que posiblemente requiera mucho tiempo y se genera un informe.
El cálculo que se realiza cuando se hace clic en Ejecutar lo produce un script almacenado en el botón Ejecutar.Este script produce un informe, que es lo que el usuario debería ver.Sin embargo, debido a que el script se agrega al botón Ejecutar, aparece el informe deseado, pero luego es seguido por el informe Ajustar mínimos cuadrados que Ejecutar produce por sí solo.El informe Ajustar mínimos cuadrados no tiene sentido para el usuario.
El siguiente script ilustra el problema. En ese script, la expresión en el botón Ejecutar, "runExpr", simplemente crea una tabla de datos clonada; esto es para simplificar la ilustración.En el script real, esa expresión (runExpr) realiza muchos análisis basados en los efectos ingresados en la ventana Ajustar modelo. Además, en el script real, el usuario completa la ventana Ajustar modelo de forma interactiva; Llené la ventana Ajustar modelo en el siguiente script por conveniencia.
Names Default To Here( 1 );
runExpr = Expr(
// Creates a clone data table for illustration;
dt << Subset( Output Table( "Clone Table" ), All rows );
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fmSLS = Fit Model(
Y( :weight ),
Effects( :age, :height, :age * :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
);
r = fmSLS << Report;
r[Button Box( 9 )] << Set Script( runExpr);
Cuando hace clic en Ejecutar, como lo haría un usuario, aparece la tabla de clonación, pero la ventana superior es el informe Ajustar mínimos cuadrados generado por el comando Ejecutar.Me gustaría evitar que ese informe aparezca.
Con ese fin:
- Intenté usar Throw() y Stop() en runExpr, pero fue en vano.
- Consideré usar una ventana modal, pero necesito la funcionalidad Macro en la ventana Ajustar modelo y no veo cómo hacer que una ventana modal sea de ayuda.
- La única forma que se me ocurre para abordar el informe Ajustar mínimos cuadrados es agregar un bucle de tiempo al script como se ilustra a continuación. Pero esto está lleno de peligros.No hay forma de saber cuánto tiempo tardará en completarse runExpr y, si el usuario decide no hacer clic en Ejecutar, el script seguirá ejecutándose hasta que se agote el tiempo de espera.
¡Cualquier idea o ayuda será muy apreciada!
Names Default To Here( 1 );
runExpr = Expr(
// Creates a clone data table for illustration;
dt << Subset( Output Table( "Clone Table" ), All rows );
fm_Flag = 1
);
fm_Flag = 0; // Sets flag for timing
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fmSLS = Fit Model(
Y( :weight ),
Effects( :age, :height, :age * :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
);
r = fmSLS << Report;
r[Button Box( 9 )] << Set Script( runExpr; fm_Flag = 1 );
For( i = 1, i <= 100, i++,
If(fm_Flag < 1, Wait(0.5), windowsopen = Get Window List(); windowsopen[nItems(windowsopen)] << Close Window; Stop() )
);
La personalización en masaRe: ¿Cómo evitar que Run in Fit Model genere un informe?¡¡¡Dios mío, eso es genial!!!¡¡¡Qué solución tan perfecta y lista para usar!!!
Estaba planeando jugar con la ubicación del botón personalizado más tarde hoy, pero no sé si alguna vez habría intentado colocarlo. encima el botón Ejecutar.Esta es una gran solución y creo que también podré utilizar este concepto en otros lugares.¡Apuesto a que a muchos usuarios les resultará útil!
¡¡¡Muchas gracias!!!
Re: ¿Cómo evitar que Run in Fit Model genere un informe?¡Ah, ja!Deshacerse o modificar el botón Ejecutar parece difícil, pero puedes colocar tu nuevo botón justo encima (al menos con JMP 15.2.1 en Windows...):
Names Default to Here( 1 );
run expr = Expr(
// desired report
personality = Report( fm )[ComboBox(1)] << Get Selected;
Show( personality );
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fm = dt << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
// New button the user should click on
(((fm << XPath("//ButtonBox[@title='Run']"))[1] << parent) ) << prepend(
bb = Button Box("Launch custom script", run expr; fm << Close Window;) );
//make sure it is right on top of the old one
bb << set property("Margin", {Left(0), Right(0), Bottom(0), Top(0)});
// Rename old button in case it isn't hidden, and show error if user clicks it
(fm << XPath("//ButtonBox[@title='Run']"))[1] << Set Script( New Window( "Use other button",
Text Box("Woops...\!n\!nPlease use the button at the bottom of the fit model dialog to launch this script.")));
(fm << XPath("//ButtonBox[@title='Run']"))[1] << Set Button Name( "Do Not Use");Re: ¿Cómo evitar que Run in Fit Model genere un informe?Mark, planteas una muy buena pregunta y expones un buen punto.Quizás haya una mejor manera de lograr mi objetivo.Consulte mi respuesta a "ih" arriba.Necesito la ventana Ajustar modelo simplemente por su flexibilidad al permitir a los usuarios construir efectos. El guión que estoy escribiendo utiliza esos efectos para construir modelos utilizando pesos de arranque fraccionarios.(De todos modos, hay más detalles en la respuesta a "ih" anterior).
Sé que existen funciones de secuencias de comandos que ayudan a construir efectos de modelo, pero realmente sería necesario replicar muchas de las funciones que existen en la ventana Ajustar modelo.¡Ojalá se pudiera usar esa ventana para la construcción de efectos sin tener que ajustarse a un modelo!
Re: ¿Cómo evitar que Run in Fit Model genere un informe?Muchas gracias por esta sugerencia; no es algo que haya considerado y puede que sea lo mejor que se puede hacer.Sin embargo, si el usuario hace clic en "Ejecutar", lo que seguramente sucederá, entonces se ejecuta Fit Model y el usuario debe ejecutar el script nuevamente.No es óptimo.Pero tal vez pueda aprovechar esta idea.
Tanto usted como Mark han planteado una buena pregunta: ¿por qué insisto en utilizar la ventana Ajustar modelo?Es porque necesito permitir que el usuario acceda a las macros y la funcionalidad cruzada.Los usuarios agregarán efectos que consideren importantes y, en muchos casos, incluirían un modelo factorial completo junto con algunos términos adicionales de interacción de tres vías.Jugué con la idea de crear un diálogo modal que permitiera a los usuarios ingresar "tipos" de modelos, pero esta funcionalidad limitaría al usuario.Así que seguí volviendo a la necesidad de tener una ventana con la mayor parte de la funcionalidad de Ajustar modelo.Además, los usuarios están familiarizados con la introducción de efectos mediante Ajustar modelo, por lo que utilizar ese cuadro de diálogo tiene sentido desde esa perspectiva.(Aprecio el enlace que proporcionaste, claro, pero no aborda la construcción de efectos.Se necesitarían muchas secuencias de comandos para replicar la funcionalidad Cruzada, Factorial completa, Factorial a grado y Polinomio a grado que existe en Ajustar modelo.De hecho, ¡no creo que sea capaz!)
Ahora, ¿por qué no quiero correr ¿Modelo de ajuste?Esto se debe a que lo único que necesito son las respuestas y los efectos; Simplemente necesito la funcionalidad de Fit Model para construir efectos.El script personalizado los utiliza, junto con el arranque fraccional ponderado aleatoriamente, para crear modelos utilizando el promedio de modelos.El script para crear estos modelos y un informe resumido, actualmente es la expresión que se coloca en el botón Ejecutar.Entonces, al hacer clic en Ejecutar se crea ese informe personalizado.Todo está bien, excepto que el informe generado por Fit Model, que es irrelevante, aparece sobre el informe personalizado cuando el usuario hace clic en Ejecutar.
De nuevo, gracias por tu ayuda.Definitivamente jugaré con la idea del botón personalizado.
Re: ¿Cómo evitar que Run in Fit Model genere un informe?¿Por qué utiliza el cuadro de diálogo Ajustar modelo si no desea la plataforma Ajustar mínimos cuadrados? Puede que haya otra forma de lograr lo que deseas.
Re: ¿Cómo evitar que Run in Fit Model genere un informe?¿Qué parte del cuadro de diálogo Especificación del modelo necesita? No puedo evitar pensar que sería mejor que reemplazaras ese paso con una nueva ventana que se adaptara exactamente a tus necesidades.Los ejemplos en esta publicación pueden ayudar:
Solicitud de columnas, totalmente modal
Si desea utilizar la ventana Especificación del modelo, puede darle al usuario un nuevo botón en el que hacer clic:
Names Default to Here( 1 );
run expr = Expr(
// desired report
personality = Report( fm )[ComboBox(1)] << Get Selected;
Show( personality );
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fm = dt << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
// Show error if user clicks the wrong button
(fm << XPath("//ButtonBox[@title='Run']"))[1] << Set Script( New Window( "Use other bottom",
Text Box("Woops...\!n\!nPlease use the button at the bottom of the fit model dialog to launch this script.")));
// Button the user should click on
(fm << XPath("//OutlineBox"))[1] << Append(Button Box("Launch custom script", run expr; fm << Close Window;));<BR />
Re: ¿Cómo evitar que Run in Fit Model genere un informe?Bien, parece que el script en el cuadro del botón se ejecuta antes de que se ejecute el comportamiento integrado del botón Ejecutar.
¡Este pequeño problema es molesto! Tiene que haber una manera de posponer la ejecución del script hasta que ocurra una acción (como presionar el botón Ejecutar). O bien, para evitar la ejecución del comportamiento integrado (pero como dije, colocar Throw y Stop en runExpr no funcionó).
Gracias por intentar ayudar, Mark.Re: ¿Cómo evitar que Run in Fit Model genere un informe?Estás en lo correcto. Intenté modificar mi ilustración, pero el script adjunto al cuadro del botón se evalúa antes de crear el informe Ajustar mínimos cuadrados, por lo que no es efectivo.
Names Default to Here( 1 );
run expr = Expr(
// desired report
personality = Report( fm )[ComboBox(1)] << Get Selected;
Show( personality );
// undesired report
window = Get Window List();
For( w = 1, w <= N Items( window ), w++,
If( Contains( window[w] << Get Window Title, "Fit Least Squares" ),
window[w] << Close Window;
Break();
);
);
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fm = dt << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
Report( fm )[ButtonBox(9)] << Set Script( run expr );
// nothing after this point
Re: ¿Cómo evitar que Run in Fit Model genere un informe?Mark, gracias, pero no creo que esto funcione para mi situación.El usuario debe completar la ventana Ajustar modelo.Si agrego su componente de ventana a mi secuencia de comandos, se ejecuta antes de que el usuario complete la ventana Ajustar modelo.Entonces, cuando el usuario hace clic en Ejecutar, esa parte del script "desaparece".Consulte el segundo script en mi publicación para ver mi solución alternativa muy poco elegante en la línea que está proponiendo.Hay que tener en cuenta el tiempo que tarda el usuario en completar Ajustar modelo y luego el tiempo que tarda en ejecutar el script en el botón Ejecutar.
Re: ¿Cómo evitar que Run in Fit Model genere un informe?No veo cómo modificar el script que adjunta al cuadro del botón Ejecutar, pero puede buscar y cerrar la ventana luego. Vea esta ilustración:
fm = Current data Table() << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" )
);
fls = fm << Run;
window = Get Window List();
For( w = 1, w <= N Items( window ), w++,
If( Contains( window[w] << Get Window Title, "Fit Least Squares" ),
window[w] << Close Window;
Break();
);
);