Variables globales sobrescritas en un bucleHola,
Creo ventanas en un bucle siguiendo las columnas. Por ejemplo, en el ejemplo JSL a continuación, creo una ventana con la distribución y un botón que oculta temporalmente la ventana para cada columna (Edad, Peso). El problema es que, a medida que avanza el bucle, las variables de objeto y se sobrescriben con la última ventana .
Por ejemplo, en la ventana de edad generada por el ejemplo, al hacer clic en el botón se supone que oculta temporalmente la ventana de Edad, pero en realidad oculta Peso porque se ha sobrescrito.
¿Es posible establecer nombres predeterminados aquí o algo similar para que cada ventana tenga su propio espacio independiente sin tener que cambiar el nombre de las variables cada vez? Porque tengo muchas...
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
lstCols = {"age", "weight"};
For Each( {value, index}, lstCols,
colref = Column( value );
window = New Window( "Window - " || value,
V List Box(
distribution = dt << Distribution( Column( colref ) ),
Button Box( "Hide",
window << show window( 0 );
Wait( 2 );
window << show window( 1 );
)
);
);
);
Automatización y scriptingRe: Variables globales sobrescritas en un buclePuedes usar el alcance de la ventana
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
nws = {};
For Each({value, index}, lstCols,
colref = Column(value);
nw = New Window("Window - " || value,
V List Box(
window:dist = dt << Distribution(Column(colref)),
Button Box("Hide",
window:dist << show window(0);
Wait(2);
window:dist << show window(1);
)
);
);
Insert Into(nws, nw);
);
For Each({nw}, nws,
Show(nw:dist << Get Window Title)
);
También puede evaluar la referencia al script/función del botón o utilizar una función ligeramente más complicada dentro del botón para tener en cuenta el alcance.
Re: Variables globales sobrescritas en un bucleA continuación se muestra una solución que no es tan elegante como la respuesta de @jthi , pero es más intuitiva desde mi perspectiva.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
lstCols = {"age", "weight"};
windows = Associative Array();
For Each( {value, index}, lstCols,
colref = Column( value );
Eval(EvalExpr(
windows[value] = New Window( "Window - " || value,
V List Box(
distribution = dt << Distribution( Column( colref ) ),
Button Box( "Hide",
windows[Expr(value)] << show window( 0 );
Wait( 2 );
windows[Expr(value)] << show window( 1 );
)
);
);
));
);
La matriz asociativa "windows" proporciona un contenedor que mantiene referencias a las diferentes ventanas y "Eval(EvalExpr(...))" se utiliza para asegurarse de que el script de un botón en particular no esté evaluando el "valor" actual sino el que estaba en el ámbito cuando fue creado.
Re: Variables globales sobrescritas en un bucle+1. El ámbito de la ventana se describe aquí: https://www.jmp.com/support/help/en/19.1/?os=mac&source=application#page/jmp/scoped-names.shtml
Re: Variables globales sobrescritas en un bucleHola, ¡gracias! Me solucionó el problema.
Re: Variables globales sobrescritas en un bucleHola, gracias por tu respuesta es otra forma de hacerlo!
Re: Variables globales sobrescritas en un bucleTambién puedes usar << Establecer función y usar la referencia de los botones como punto de "inicio".
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
For Each({colname}, lstCols,
nw = New Window("Window - " || colname,
V List Box(
dt << Distribution(Column(Eval(colname))),
Button Box("Hide", << Set Function(Function({this},
dist_ob = this << prev sib;
show(dist_ob[OutlineBox(2)] << get title);
)));
);
);
);
Write();
and in this case for hiding the window you could just use this << Show Window(0);</CODE></EM></P>
<P>El cuadro de contexto también se puede utilizar en ocasiones:</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
For Each({colname}, lstCols,
nw = New Window("Window - " || colname,
V List Box(
Context Box(
box:dist = dt << Distribution(Column(Eval(colname))),
Button Box("Hide",
show(Report(box:dist)[OutlineBox(2)] << get title)
);
)
);
);
);
Write();
Utilizo todos estos métodos (y evaluación de expresiones) dependiendo de la situación.