Hallo zusammen,
Ich habe Probleme mit Variablen, die in einem Expr1() normal ausgewertet werden und in einem anderen Expr2(), der den ersten Expr aufruft, nicht richtig ausgewertet werden. Ich habe Code, in dem ich ein Expr1() definiert habe, das Verteilungen von interessierenden Spalten generiert. Ich habe später einen weiteren Ausdruck, Expr2(), der Expr1() zurückruft. Es gibt Variablen in Expr1(), die in Expr2() scheinbar nicht richtig ausgewertet werden.
Für ein visuelles Element generiert Expr2() ein Fenster, das wie folgt aussieht:

Der erste Ausdruck, Expr1(), generiert die enthaltene Verteilungsplattform unterhalb des Diagrammerstellers. Das Kombinationsfeld und die Schaltflächenfelder unterhalb der Verteilungen ermöglichen es dem Benutzer, zwischen verschiedenen Anpassungsstatistiken zu wechseln, z. B. unterschiedlichem R^2, RMSE, mittlerer ABS-Abw, -Logiklihood usw. Meine Absicht ist es, sowohl den GB als auch die Verteilung entsprechend zu aktualisieren. Der GB wird entsprechend aktualisiert, die Distribution jedoch nicht. Wenn Sie beispielsweise die Fit-Statistik auf RMSE ändern, ergibt sich folgendes Ergebnis:

Es aktualisiert zwar die Verteilungsdiagramme, verwendet jedoch deren Standardgrößeneinstellung und nicht die Größeneinstellung, die ich in Expr1() festgelegt habe. Es soll so aussehen, dass die Verteilungsdiagramme die gleiche Größe haben wie im ersten Bild:

Der Codeabschnitt in Expr1(), in dem die Verteilungen generiert werden, ist der folgende:
//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 )} )
)
);Wenn ich Expr1() allein ausführe, funktioniert es einwandfrei. Das Problem besteht darin, dass Expr2() beim Aufrufen von Expr1() fehlschlägt, da die Variablen sfitcol# in Dispatch nicht ausgewertet werden und die FrameBox-Größe dadurch nicht geändert wird wie es im Code vorgesehen ist.
Der Codeabschnitt in Expr2(), der die Verteilungen austauscht (nur über das Kombinationsfeld), ist unten:
NNycb = Combo Box(
NNylist,
<<SET></SET>
Wenn man damit herumspielt, den Teil von Expr1() in die Combo-Box-Funktion einzufügen und dann versucht, die Sfitcol-Variablen auszuführen und sie dann an den Bericht zu senden, um die Frame-Box zu ändern, wird dieser Fehler im eingebetteten Protokoll angezeigt:
Das Element „sfitcol1“ kann im Gliederungskontext {sfitcol1} nicht gefunden werden.
Das Element „sfitcol1“ kann im Gliederungskontext {sfitcol1} nicht gefunden werden.
Das Element „sfitcol2“ kann im Gliederungskontext {sfitcol2} nicht gefunden werden.
Das Element „sfitcol2“ kann im Gliederungskontext {sfitcol2} nicht gefunden werden.
Das Element „sfitcol3“ kann im Gliederungskontext {sfitcol3} nicht gefunden werden.
Das Element „sfitcol3“ kann im Gliederungskontext {sfitcol3} nicht gefunden werden.
Wenn ich dann den Spaltennamen manuell eintrage, zum Beispiel beim ersten Dispatch: Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)}), dann ändert sich das Rahmenkasten entsprechend anpassen.

Es ist also möglich und sollte durchgehen, wie ich Dinge in Expr1() definiert habe, aber die Variable und nicht der Wert (Text) der Variablen wird übergeben, wenn Dinge in Expr2() ausgeführt werden. Ich hoffe, ein paar Vorschläge zu bekommen, wie man das beheben kann. Ich glaube nicht, dass ich eine Lösung vom Typ Eval(Substitute(Expr())) verwenden muss, aber vielleicht tue ich das.
Alle Gedanken/Ideen/Vorschläge sind sehr willkommen.
Danke!,
DS
Ich würde es vermeiden, die Rahmengrößen beim Erstellen der Verteilungen festzulegen und sie nach der Erstellung der Verteilungen zu ändern. Da Sie bestimmte Frameboxen auf bestimmte Größen festlegen, sollte dies relativ einfach sein, indem Sie XPath verwenden, um die Referenzen abzurufen und dann die Größen zu ändern.
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;
Was das Problem betrifft, mit dem Sie konfrontiert sind, müsste ich zur Sicherheit ein Testskript schreiben, aber ich vermute, dass Sie diese Werte dort auswerten sollten.
Hallo @jthi ,
Nochmals vielen Dank für die schnelle Antwort und Lösung meines Problems. Der XPath-Befehl ist wirklich cool, und allein durch das Lesen des kurzen Scripting-Index-Eintrags wird mir klar, dass ich mehr über XPath lesen muss und wie ich mehr daraus machen kann. Nebenbei bemerkt: Wurde dies bereits im Scripter's Club diskutiert? Wenn nicht, könnte das ein gutes Thema sein.
Wie auch immer, ich habe Ihren Code geändert, um ihn näher an die Situation anzupassen, die ich gerade habe, und er funktioniert einwandfrei. Sehen Sie sich die modifizierte Version unten an, in der Expr2 Expr1 aufruft und sich dann in Expr2 die Änderung für die Verteilungsrahmengröße befindet.
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;
Für alle, die das vielleicht nicht wissen, ist zu beachten, dass der XPath-Teil des Codes nicht im New Window()-Objekt enthalten sein darf.
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
Dieser Teil des Codes muss sich außerhalb des neuen Fensters befinden. In meinem speziellen Fall habe ich herausgefunden, dass ich es als Teil der Funktion einschließen muss, wenn das Kombinationsfeld oder die Schaltflächen „Vorher/Weiter“ gedrückt werden, da sonst die Größe der Verteilungen auf ihre ursprüngliche Größe zurückgesetzt wird. Für die Option „Kombinationsfeld“ sieht es beispielsweise so aus:
NNycb = Combo Box(
NNylist,
<<SET></SET>
Es gibt einen kurzen Moment, in dem die Größe der Verteilungen auf die Standardgröße zurückgesetzt wird, wenn sie zum ersten Mal dem Fenster vorangestellt wird, aber dann wird die Größe sehr schnell korrekt angepasst.
Nochmals vielen Dank für die Hilfe, und ich schätze es immer, im JMP-Diskussionsforum neue Dinge zu lernen.
Danke!,
DS
Ich glaube, ich habe XPath in Sitzung 7 (Berichtsebene) sehr kurz behandelt, aber ich denke, dass der Zugriff auf und das Durchqueren der Berichtsebene ein gutes Thema für andere längere Sitzungen ist. Xpath ist im Grunde eine eigene Sprache und eine der Fähigkeiten, die direkt von JSL in andere Programmiersprachen übersetzt werden können (Regex ist ein anderes Beispiel). XPath-Tutorial (w3schools.com) . Wenn Sie mit << XPath auf die Berichtsebene in JMP zugreifen, können Sie ganz einfach eine erhalten Liste von Referenzen und Sie können Nachrichten an die Liste senden, was sie sehr nützlich macht. Sie können robuste „Pfade“ (im Grunde genommen Referenzen abrufen) zu verschiedenen Anzeigefeldern erstellen, wenn Sie << Get XML mit << XPath kombinieren.