Variabili globali sovrascritte in un cicloCiao,
Creo finestre in un ciclo seguendo le colonne. Ad esempio, nell'esempio JSL qui sotto, creo una finestra con la distribuzione e un pulsante che nasconde temporaneamente la finestra per ogni colonna (Età, Peso). Il problema è che, man mano che il ciclo procede, le variabili oggetto y vengono sovrascritte dall'ultima finestra .
Ad esempio, nella finestra dell'età generata dall'esempio, cliccando sul pulsante si dovrebbe nascondere temporaneamente la finestra dell'età, ma in realtà nasconde il peso perché è stato sovrascritto.
È possibile impostare un nome predefinito qui o qualcosa del genere in modo che ogni finestra abbia il suo spazio indipendente senza dover cambiare ogni volta il nome delle variabili per ogni finestra? Perché ne ho molte...
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 );
)
);
);
);
Automazione e scriptingRe: Variabili globali sovrascritte in un cicloPuoi usare l'ambito della finestra
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)
);
È anche possibile valutare il riferimento allo script/funzione del pulsante o utilizzare una funzione leggermente più complessa all'interno del pulsante per tenere conto dell'ambito.
Re: Variabili globali sovrascritte in un cicloDi seguito è riportata una soluzione che non è elegante quanto la risposta di @jthi , ma dal mio punto di vista è più intuitiva.
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 );
)
);
);
));
);
L'array associativo "windows" fornisce un contenitore che mantiene i riferimenti alle diverse finestre e "Eval(EvalExpr(...))" viene utilizzato per assicurarsi che lo script di un particolare pulsante non valuti il "valore" corrente, ma quello nell'ambito al momento della sua creazione.
Re: Variabili globali sovrascritte in un ciclo+1. L'ambito della finestra è descritto qui: https://www.jmp.com/support/help/en/19.1/?os=mac&source=application#page/jmp/scoped-names.shtml
Re: Variabili globali sovrascritte in un cicloCiao grazie! Ha risolto il mio problema
Re: Variabili globali sovrascritte in un cicloCiao, grazie per la risposta, è un altro modo per farlo!
Re: Variabili globali sovrascritte in un cicloPuoi anche usare << Imposta funzione e usare il riferimento ai pulsanti come punto di "partenza"
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>A volte la casella di contesto può essere utilizzata anche:</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();
Utilizzo tutti questi metodi (e la valutazione dell'espressione) a seconda della situazione.