Verlust des Handles für das Fenster des Graph BuilderIch verwende das baseball.jmp-Skript, um ein Problem zu veranschaulichen, das ich in meinem eigenen Skript sehe. Das Folgende läuft wie erwartet. Ein einzelnes Graph Builder-Fenster wird erstellt und nach zwei Sekunden geschlossen.
Clear Globals();
Names Default To Here( 1 );
dt = Open( "C:\Program Files\SAS\JMP\14\Samples\Data\Baseball.jmp" );
current data table(dt);
myGraph = Graph Builder(
Size( 531, 448 ),
Show Control Panel( 0 ),
Variables( X( :Player ), Y( :Batting ) ),
Elements( Points( X, Y, Legend( 2 ) ) ),
);
myRep = myGraph << report;
wait(2);
myGraph << close window;
Ich versuche jedoch, einen Graph Builder-Ausdruck in einer Funktion zu erstellen, um diese flexibler zu gestalten. Betrachten Sie im folgenden Beispiel myExpr als konstruierten Ausdruck. Beachten Sie, dass die Verzögerungen von 2 Sekunden so sind, dass ich herausfinden kann, wann die Fenster erstellt werden.
Clear Globals();
Names Default To Here( 1 );
dt = Open( "C:\Program Files\SAS\JMP\14\Samples\Data\Baseball.jmp" );
current data table(dt);
myExpr = expr(Graph Builder(
Size( 531, 448 ),
Show Control Panel( 0 ),
Variables( X( :Player ), Y( :Batting ) ),
Elements( Points( X, Y, Legend( 2 ) ) ),
));
myExpr1 = expr(myGraph = eval expr(myExpr));
eval(myExpr1);
wait(2);
myRep = myGraph << report;
wait(2);
myGraph << close window;
Folgendes passiert, was für mich keinen Sinn ergibt:
- Ein zweites und identisches Graph Builder-Fenster wird geöffnet, wenn die Berichtsebene erstellt wird.
- Das myGraph-Handle, das beim Erstellen der Berichtsebene funktioniert hat, funktioniert beim Ausführen von myGraph << Fenster schließen nicht. Dadurch bleiben zwei Fenster des Graph Builder geöffnet.
Ich kann das unerwartete zweite Fenster mit myRep << Fenster schließen, aber das myGraph-Fenster nicht schließen. Ich kann die Berichtsebene wie gewohnt bearbeiten.
Meine Fragen sind also:
- Warum wird ein zweites Graph Builder-Fenster erstellt?
- Warum verliere ich das myGraph-Handle?
Vielen Dank,
Rechnung
Betreff: Verlust des Handles im Graph Builder FensterIhre 2 Fragen werden am besten in umgekehrter Reihenfolge beantwortet:
- Warum wird ein zweites Graph Builder-Fenster erstellt?
- Warum verliere ich das myGraph-Handle?
2. Wenn Sie sich ansehen, wonach der Wert von myGraph strebt
eval(myExpr1);
Sie werden sehen, dass die Variable nicht so eingestellt ist, dass sie auf das Graph Builder-Objekt zeigt, sondern nur als die zum Ausführen des Graph Builder erforderliche JSL definiert ist
Graph Builder(Size(531, 448), Show Control Panel(0), Variables(X(:Player), Y(:Batting)), Elements(Points(X, Y, Legend(2))));
Sie müssen es in den myExpr-Ausdruck verschieben. Dann zeigt es auf das gewünschte Graph Builder-Objekt.
1. Der Grund, warum zwei Fenster angezeigt werden, liegt darin, dass Sie dies angeben
eval(myExpr1);
Es führt den Wert von myGraph aus, einer JSL-Zeile, die ein Fenster mit der Ausgabe erstellt, und erneut, wenn die Variable myGraph analysiert wird
myRep = myGraph << report;
es wird die JSL von der Variablen myGraph noch einmal ausführen
Nachstehend ist meine Überarbeitung Ihres Codes aufgeführt, um das zu tun, was Sie meines Erachtens tun möchten
Clear Globals();
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Baseball.jmp" );
current data table(dt);
myExpr = expr(myGraph = Graph Builder(
Size( 531, 448 ),
Show Control Panel( 0 ),
Variables( X( :Player ), Y( :Batting ) ),
Elements( Points( X, Y, Legend( 2 ) ) ),
));
myExpr1 = expr(eval expr(myExpr));
eval(myExpr1);
wait(2);
myRep = myGraph << report;
wait(2);
myGraph << close window;
Betreff: Verlust des Handles im Graph Builder FensterHallo Jim,
Vielen Dank für die Erklärung. Gerade als ich dachte, ich fange an, JSL-Ausdrücke zu verstehen ...
Wie auch immer, das Erstellen des Ausdrucks: expr (Graph Builder (hier meine Daten einfügen)) ist einfacher als das Erstellen des Ausdrucks: expr (myGraph = Graph Builder (hier meine Daten einfügen))
Deshalb habe ich diesen Ansatz gewählt.
Danke noch einmal,
Rechnung