Perdita di handle per la finestra del generatore di graficiSto usando lo script baseball.jmp per illustrare un problema che sto vedendo nel mio script. Il seguente funziona come previsto. Viene creata una finestra del generatore grafico singolo e si chiude dopo due secondi.
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;
Tuttavia, sto cercando di creare un'espressione del generatore di grafici in una funzione per renderla più flessibile. Quindi, nell'esempio seguente, considera myExpr come espressione costruita. Si noti che i ritardi di 2 secondi sono così da poter capire quando vengono create le finestre.
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;
Ciò che segue non ha senso per me:
- Una seconda e identica finestra del generatore grafico si apre quando viene creato il livello del report.
- L'handle myGraph che stava funzionando durante la creazione del livello report, non funziona quando si esegue myGraph << chiudi finestra. Questo lascia aperte due finestre del generatore di grafici.
Sono in grado di chiudere l'inaspettata seconda finestra con myRep << chiudi finestra, ma non riesco a chiudere la finestra myGraph. Sono in grado di manipolare il livello del report come al solito.
Quindi le mie domande sono:
- Perché viene creata una seconda finestra del generatore di grafici?
- Perché sto perdendo l'handle myGraph?
Grazie,
Conto
Ri: perdita di handle per la finestra del generatore di graficiLe tue 2 domande avranno la migliore risposta in ordine inverso:
- Perché viene creata una seconda finestra del generatore di grafici?
- Perché sto perdendo l'handle myGraph?
2. Se guardi quale è il valore di myGraph è dopo
eval(myExpr1);
vedrai che la variabile non è impostata per puntare all'oggetto Graph Builder, ma è piuttosto appena definita come la JSL richiesta per eseguire Graph Builder
Graph Builder(Size(531, 448), Show Control Panel(0), Variables(X(:Player), Y(:Batting)), Elements(Points(X, Y, Legend(2))));
Quello che devi fare è spostarlo nell'espressione myExpr. Quindi punterà all'oggetto Graph Builder come vuoi.
1. Il motivo per cui visualizzi due finestre è quello specificato
eval(myExpr1);
esegue il valore di myGraph, che è una linea di JSL che crea una finestra con l'output, e poi di nuovo, quando la variabile myGraph viene analizzata in
myRep = myGraph << report;
eseguirà ancora il JSL dalla variabile myGraph
Di seguito è la mia rielaborazione del codice per fare ciò che credo tu voglia fare
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;
Ri: perdita di handle per la finestra del generatore di graficiCiao Jim,
Grazie per la spiegazione. Proprio quando pensavo di iniziare a capire le espressioni JSL ....
Comunque costruire l'espressione: expr (graph builder (inserisci qui le mie cose)) è più facile che costruire la expession: expr (myGraph = graph builder (inserisci qui le mie cose))
Questo è il motivo per cui ho seguito questo approccio.
Grazie ancora,
Conto