Comment empêcher Run in Fit Model de produire un rapport ?J'écris un script qui fait ce qui suit :
- Ouvre une fenêtre Ajuster le modèle,
- Permet à l'utilisateur de le remplir à l'aide des macros et d'autres fonctionnalités de la fenêtre Ajuster le modèle,
- Permet à l'utilisateur de cliquer sur Exécuter, auquel cas un calcul éventuellement fastidieux est effectué et un rapport est produit.
Le calcul effectué lorsque vous cliquez sur Exécuter est produit par un script stocké dans le bouton Exécuter.Ce script produit un rapport que l'utilisateur devrait voir.Cependant, étant donné que le script est ajouté au bouton Exécuter, le rapport souhaité apparaît, mais est ensuite suivi du rapport Ajuster les moindres carrés que l'exécution produit lui-même.Le rapport Ajuster les moindres carrés n'a aucun sens pour l'utilisateur.
Le script ci-dessous illustre le problème. Dans ce script, l'expression du bouton Exécuter, « runExpr », crée simplement une table de données de clonage ; c'est pour simplifier l'illustration.Dans le script actuel, cette expression (runExpr) effectue de nombreuses analyses basées sur les effets saisis dans la fenêtre Ajuster le modèle. De plus, dans le script réel, l'utilisateur remplit la fenêtre Ajuster le modèle de manière interactive ; J'ai rempli la fenêtre Ajuster le modèle dans le script ci-dessous pour plus de commodité.
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);
Lorsque vous cliquez sur Exécuter, comme le ferait un utilisateur, la table de clonage apparaît, mais la fenêtre du haut est le rapport Ajuster les moindres carrés produit par la commande Exécuter.Je voudrais empêcher la parution de ce rapport.
À cette fin:
- J'ai essayé d'utiliser Throw() et Stop() dans runExpr, mais en vain.
- J'ai envisagé d'utiliser une fenêtre modale, mais j'ai besoin de la fonctionnalité Macro dans la fenêtre Ajuster le modèle et je ne vois pas comment créer une aide de fenêtre modale.
- La seule façon à laquelle je peux penser, même pour traiter le rapport Ajuster les moindres carrés, est d'ajouter une boucle de synchronisation au script, comme illustré ci-dessous. Mais cela comporte de nombreux périls.Il n'y a aucun moyen de savoir combien de temps il faudra pour que runExpr se termine, et si l'utilisateur décide de ne pas cliquer sur Exécuter, le script continue de s'exécuter jusqu'à expiration.
Toute pensée ou aide serait grandement appréciée !
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() )
);
Personnalisation de masseRe : Comment empêcher Run in Fit Model de produire un rapport ?Oh mon Dieu, c'est génial !!!Quelle solution parfaite "prête à l'emploi" !!!
J'avais prévu de jouer avec le placement du bouton personnalisé plus tard dans la journée, mais je ne sais pas si j'aurais un jour essayé de le placer. sur le bouton Exécuter.C'est une excellente solution et je pense que je pourrai également utiliser ce concept ailleurs.Je parie que de nombreux utilisateurs le trouveront utile !
Merci beaucoup!!!
Re : Comment empêcher Run in Fit Model de produire un rapport ?Ah ah !Se débarrasser ou modifier le bouton Exécuter semble difficile, mais vous pouvez placer votre nouveau bouton juste au-dessus (au moins avec JMP 15.2.1 sous 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 : Comment empêcher Run in Fit Model de produire un rapport ?Mark, vous soulevez une très bonne question et vous faites valoir un bon argument.Il existe peut-être une meilleure façon d’atteindre mon objectif.Veuillez consulter ma réponse à "ih" ci-dessus.J'ai besoin de la fenêtre Ajuster le modèle simplement en raison de sa flexibilité permettant aux utilisateurs de créer des effets. Le script que j'écris utilise ces effets pour construire des modèles utilisant des poids bootstrap fractionnaires.(Quoi qu'il en soit, il y a plus de détails dans la réponse à "ih" ci-dessus.)
Je sais qu'il existe des fonctions de script qui aident à construire des effets de modèle, mais il faudrait vraiment reproduire une grande partie des fonctionnalités qui existent dans la fenêtre Ajuster le modèle.J'aimerais que l'on puisse utiliser cette fenêtre pour la construction d'effets sans avoir à ajuster un modèle !
Re : Comment empêcher Run in Fit Model de produire un rapport ?Merci beaucoup pour cette suggestion - ce n'est pas quelque chose que j'avais envisagé, et c'est peut-être la meilleure que l'on puisse faire.Si l'utilisateur clique sur "Exécuter", ce qui est inévitable, alors Fit Model est exécuté et l'utilisateur doit réexécuter le script.Ce n'est pas optimal.Mais peut-être que je peux exploiter cette idée.
Mark et vous avez soulevé une bonne question, à savoir pourquoi j'insiste pour utiliser la fenêtre Ajuster le modèle.C'est parce que je dois autoriser l'utilisateur à accéder aux fonctionnalités Macros et Cross.Les utilisateurs ajouteront les effets qu'ils jugent importants et, dans de nombreux cas, ceux-ci incluront un modèle factoriel complet ainsi que des termes d'interaction à trois voies supplémentaires.J'ai joué avec l'idée de créer une boîte de dialogue modale qui permettrait aux utilisateurs de saisir des « types » de modèles, mais cette fonctionnalité limiterait l'utilisateur.Je revenais donc sans cesse sur la nécessité d'avoir une fenêtre avec la plupart des fonctionnalités de Fit Model.De plus, les utilisateurs sont habitués à saisir des effets à l'aide de Ajuster le modèle. L'utilisation de cette boîte de dialogue est donc logique de ce point de vue.(J'apprécie le lien que vous avez fourni, ih, mais il n'aborde pas la construction des effets.Il faudrait beaucoup de scripts pour reproduire les fonctionnalités croisées, factorielles complètes, factorielles en degrés et polynomiales en degrés qui existent dans Ajuster le modèle.En fait, je ne pense pas en être capable !)
Maintenant, pourquoi je ne veux pas courir Modèle adapté ?C'est parce que tout ce dont j'ai besoin, ce sont les réponses et les effets ; J'ai simplement besoin de la fonctionnalité Fit Model pour créer des effets.Le script personnalisé les utilise, ainsi que le bootstrap fractionnaire pondéré de manière aléatoire, pour créer des modèles à l'aide de la moyenne des modèles.Le script permettant de créer ces modèles et un rapport récapitulatif est actuellement l'expression placée dans le bouton Exécuter.Donc, cliquer sur Exécuter crée ce rapport personnalisé.Tout va bien, sauf que le rapport produit par Fit Model, qui n'est pas pertinent, apparaît par-dessus le rapport personnalisé lorsque l'utilisateur clique sur Exécuter.
Merci encore pour votre aide.Je vais certainement jouer avec l'idée du bouton personnalisé.
Re : Comment empêcher Run in Fit Model de produire un rapport ?Pourquoi utilisez-vous la boîte de dialogue Ajuster le modèle si vous ne souhaitez pas utiliser la plateforme Ajuster les moindres carrés ? Il existe peut-être une autre façon d’obtenir ce que vous voulez.
Re : Comment empêcher Run in Fit Model de produire un rapport ?De quelle quantité de boîte de dialogue Spécification du modèle avez-vous besoin ? Je ne peux m'empêcher de penser que vous seriez mieux servi en remplaçant cette étape par une nouvelle fenêtre répondant exactement à vos besoins.Les exemples de cet article pourraient aider :
Inviter des colonnes, de manière totalement modale
Si vous souhaitez utiliser la fenêtre Spécification du modèle, vous pouvez donner à l'utilisateur un nouveau bouton sur lequel cliquer :
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 : Comment empêcher Run in Fit Model de produire un rapport ?À droite, il semble que le script dans la zone du bouton soit exécuté avant que le comportement intégré du bouton Exécuter ne soit exécuté.
Ce petit problème est embêtant ! Il doit y avoir un moyen de suspendre l'exécution du script jusqu'à ce qu'une action (comme appuyer sur le bouton Exécuter) se produise. Ou, pour empêcher l'exécution du comportement intégré (mais comme je l'ai dit, placer Throw et Stop dans runExpr n'a pas fonctionné).
Merci d'avoir essayé d'aider, Mark.Re : Comment empêcher Run in Fit Model de produire un rapport ?Vous avez raison. J'ai essayé de modifier mon illustration mais le script attaché à la zone de bouton est évalué avant la création du rapport Ajuster les moindres carrés, il est donc inefficace.
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 : Comment empêcher Run in Fit Model de produire un rapport ?Mark, merci, mais je ne pense pas que cela fonctionne pour ma situation.L'utilisateur doit remplir la fenêtre Ajuster le modèle.Si j'ajoute votre composant de fenêtre à mon script, il s'exécute avant que l'utilisateur n'ait rempli la fenêtre Ajuster le modèle.Ainsi, lorsque l'utilisateur clique sur Exécuter, cette partie du script est « disparue ».Veuillez consulter le deuxième script de mon message pour voir ma solution de contournement très inélégante dans le sens que vous proposez.Il faut tenir compte du temps nécessaire à l'utilisateur pour remplir le modèle Ajuster, puis du temps nécessaire pour exécuter le script dans le bouton Exécuter.
Re : Comment empêcher Run in Fit Model de produire un rapport ?Je ne vois pas comment modifier le script que vous joignez à la zone du bouton Exécuter, mais vous pouvez rechercher et fermer la fenêtre par la suite. Voir cette illustration :
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();
);
);