Pérdida de manija a la ventana del generador de gráficosEstoy utilizando el script baseball.jmp para ilustrar un problema que veo en mi propio script. Lo siguiente se ejecuta como se esperaba. Se crea una única ventana del generador de gráficos y se cierra después de dos segundos.
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;
Sin embargo, estoy tratando de construir una expresión de generador de gráficos en una función para hacerlo más flexible. Así que en el siguiente ejemplo, considere myExpr como la expresión construida. Tenga en cuenta que los retrasos de 2 segundos son para que pueda averiguar cuándo se crean las ventanas.
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;
Sucede lo siguiente que no tiene sentido para mí:
- Una segunda e idéntica ventana del generador de gráficos se abre cuando se crea la capa de informe.
- El identificador de myGraph que estaba funcionando al crear la capa de informe, no funciona al ejecutar myGraph << cerrar ventana. Esto deja abiertas dos ventanas del generador de gráficos.
Puedo cerrar la segunda ventana inesperada con myRep << cerrar ventana, pero no puedo cerrar la ventana myGraph. Soy capaz de manipular la capa de informe como de costumbre.
Así que mis preguntas son:
- ¿Por qué se crea una segunda ventana del generador de gráficos?
- ¿Por qué estoy perdiendo el mango myGraph?
Gracias,
Cuenta
Re: Pérdida de manija a la ventana del generador de gráficosSus 2 preguntas se responden mejor en orden inverso:
- ¿Por qué se crea una segunda ventana del generador de gráficos?
- ¿Por qué estoy perdiendo el mango myGraph?
2. Si nos fijamos en lo que el valor de myGraph es después
eval(myExpr1);
verá que la variable no está configurada para apuntar al objeto Generador de gráficos, sino que se define simplemente como la JSL requerida para ejecutar el Generador de gráficos
Graph Builder(Size(531, 448), Show Control Panel(0), Variables(X(:Player), Y(:Batting)), Elements(Points(X, Y, Legend(2))));
Lo que debe hacer es moverlo a la expresión myExpr. A continuación, apuntará al objeto Generador de gráficos que desee.
1. La razón por la que está visualizando dos ventanas es que cuando especifica
eval(myExpr1);
ejecuta el valor de myGraph, que es una línea de JSL que crea una ventana con la salida, y luego nuevamente, cuando se analiza la variable myGraph
myRep = myGraph << report;
ejecutará el JSL desde la variable myGraph una vez más
A continuación se muestra la modificación de su código para hacer lo que creo que desea hacer.
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;
Re: Pérdida de manija a la ventana del generador de gráficosHola Jim,
Gracias por la explicación. Justo cuando pensaba que estaba empezando a entender las expresiones JSL ...
De todos modos, construir la expresión: expr (generador de gráficos (insertar mis cosas aquí)) es más fácil que construir la expession: expr (myGraph = graph builder (insertar mis elementos aquí))
Es por eso que tomé ese enfoque.
Gracias de nuevo,
Cuenta