Salut tout le monde,
J'ai des difficultés avec les variables qui s'évaluent normalement dans une Expr1() qui ne s'évaluent pas correctement dans une autre Expr2() qui appelle la première Expr. J'ai du code dans lequel j'ai défini un Expr1() qui génère des distributions de colonnes d'intérêt. J'ai une autre expression plus tard, Expr2() qui rappelle Expr1(). Il existe des variables dans Expr1() qui semblent ne pas s'évaluer correctement dans Expr2().
Pour un visuel, Expr2() génère une fenêtre qui ressemble à ce qui suit :

La première expression, Expr1() est ce qui génère la plateforme de distribution incluse sous le générateur de graphiques. La zone de liste déroulante et les boutons situés sous les distributions permettent à l'utilisateur de basculer entre différentes statistiques d'ajustement, telles que différents R^2, RMSE, Mean Abs Dev, -Logliklihood, etc. Mon intention est de mettre à jour à la fois le GB et la distribution en conséquence. Le GB se met à jour de manière appropriée, mais pas la distribution. Lorsque vous modifiez la statistique d'ajustement en RMSE, par exemple, voici le résultat :

Il met à jour les graphiques de distribution, mais il utilise leur paramètre de taille par défaut et non le paramètre de taille que j'ai défini dans Expr1(). c'est censé ressembler à ceci où les graphiques de distribution ont la même taille que dans la première image :

La section de code dans Expr1() où les distributions sont générées est la suivante :
//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 j'exécute Expr1() seul, cela fonctionne très bien, le problème est que lorsque Expr2() appelle Expr1(), il échoue car il n'évalue pas les variables sfitcol# dans Dispatch, donc cela ne change pas la taille de FrameBox. comme c'est censé le faire dans le code.
La section de code dans Expr2() qui permute les distributions (en utilisant uniquement la zone de liste déroulante) est ci-dessous :
NNycb = Combo Box(
NNylist,
<<SET></SET>
Jouer en plaçant la partie Expr1() dans la fonction Combo Box, puis en essayant d'exécuter les variables sfitcol, puis en les envoyant au rapport pour modifier la zone de cadre donne cette erreur dans le journal intégré :
Impossible de trouver l'élément "sfitcol1" dans le contexte du plan {sfitcol1}
Impossible de trouver l'élément "sfitcol1" dans le contexte du plan {sfitcol1}
Impossible de trouver l'élément "sfitcol2" dans le contexte du plan {sfitcol2}
Impossible de trouver l'élément "sfitcol2" dans le contexte du plan {sfitcol2}
Impossible de trouver l'élément "sfitcol3" dans le contexte du plan {sfitcol3}
Impossible de trouver l'élément "sfitcol3" dans le contexte du plan {sfitcol3}
Si je saisis ensuite manuellement le nom de la colonne, par exemple avec le premier Dispatch : Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)}), alors cela changera la boîte de cadre en conséquence.

Donc, c'est possible et cela devrait fonctionner selon la façon dont j'ai défini les choses dans Expr1(), mais la variable et non la valeur (texte) de la variable est transmise lors de l'exécution des choses dans Expr2(). En espérant avoir quelques suggestions sur la façon de corriger cela. Je ne pense pas avoir besoin d'utiliser une solution de type Eval(Substitute(Expr())), mais peut-être que je le fais.
Toutes les pensées/idées/suggestions sont très appréciées.
Merci!,
DS
J'éviterais de définir les tailles de cadre lors de la création des distributions et de les modifier une fois les distributions créées. Lorsque vous définissez des framebox spécifiques sur des tailles spécifiques, cela devrait être assez simple en utilisant XPath pour obtenir les références, puis en modifiant les tailles.
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;
Concernant le problème auquel vous êtes confronté, je devrais écrire un script de test pour en être sûr, mais je suppose que vous devriez y évaluer ces valeurs.
Salut @jthi ,
Merci encore pour votre réponse rapide et votre solution à mon problème. La commande XPath est vraiment cool, et je peux voir, en lisant simplement la brève entrée de l'index de script, que j'ai besoin d'en savoir plus sur XPath et comment en tirer le meilleur parti. En passant, cela a-t-il déjà été discuté au sein du Scripter's Club ? Sinon, ça pourrait être un bon sujet.
Quoi qu'il en soit, j'ai modifié votre code pour être plus proche de la situation que j'ai sous la main, et cela fonctionne très bien. Voir la version modifiée ci-dessous, dans laquelle Expr2 appelle Expr1, puis à l'intérieur de Expr2, se trouve le changement de taille du répartiteur.
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;
Une chose à noter pour tous ceux qui ne le savent pas est que vous ne pouvez pas avoir la partie XPath du code dans l'objet 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 );
Cette partie du code doit se trouver en dehors de la nouvelle fenêtre. Dans mon cas particulier, j'ai découvert que je devais l'inclure dans la fonction lorsque la zone de liste déroulante ou les boutons Précédent/Suivant sont enfoncés, sinon les distributions sont redimensionnées à leur taille d'origine. Par exemple, pour l'option Combo Box, cela ressemble à :
NNycb = Combo Box(
NNylist,
<<SET></SET>
Il y a un bref instant où les distributions sont redimensionnées à leur valeur par défaut lorsqu'elles sont ajoutées pour la première fois au début de la fenêtre, mais elles sont ensuite correctement redimensionnées très rapidement.
Merci encore pour votre aide et j'apprécie toujours d'apprendre de nouvelles choses sur le forum de discussion JMP.
Merci!,
DS
Je pense avoir abordé XPath très brièvement lors de la session 7 (couche de rapport), mais je pense que l'accès et la traversée de la couche de rapport sont un bon sujet pour une autre session plus longue. XPath est fondamentalement son propre langage et l'une des compétences qui se traduisent directement de JSL vers d'autres langages de programmation (regex est un autre exemple) Tutoriel XPath (w3schools.com) . Lorsque vous accédez à la couche de rapport dans JMP à l'aide de << XPath, vous pouvez facilement obtenir un liste de références et vous pouvez envoyer des messages à la liste, ce qui la rend très utile. Vous pouvez créer des "chemins" robustes (essentiellement obtenir des références) vers différentes zones d'affichage lorsque vous combinez << Get XML avec << XPath.