Globale Variablen werden in einer Schleife überschriebenHallo,
Ich erstelle in einer Schleife Fenster, die den Spalten folgen. Im folgenden JSL-Beispiel erstelle ich beispielsweise für jede Spalte (Alter, Gewicht) ein Fenster mit der Verteilung und einen Button, der das Fenster vorübergehend ausblendet. Das Problem ist, dass meine Objektvariablen im Verlauf der Schleife vom letzten Fenster überschrieben werden .
Beispielsweise soll im durch das Beispiel erzeugten Altersfenster ein Klick auf die Schaltfläche das Altersfenster vorübergehend ausblenden, tatsächlich wird aber das Gewicht ausgeblendet, da dieses überschrieben wurde.
Kann man eine Art Standardnamen festlegen, sodass jedes Fenster seinen eigenen Bereich hat, ohne dass ich die Variablennamen jedes Mal für jedes Fenster ändern muss? Ich habe nämlich sehr viele Fenster…
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 );
)
);
);
);
Automatisierung und SkripterstellungBetreff: Globale Variablen werden in einer Schleife überschriebenSie können den Fensterbereich verwenden.
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)
);
Alternativ könnten Sie den Verweis auf das Button-Skript/die Funktion auswerten oder eine etwas komplexere Funktion innerhalb des Buttons verwenden, um den Gültigkeitsbereich zu berücksichtigen.
Betreff: Globale Variablen werden in einer Schleife überschriebenNachfolgend eine Lösung, die zwar nicht so elegant ist wie die Antwort von @jthi , aber aus meiner Sicht intuitiver.
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 );
)
);
);
));
);
Das assoziative Array "windows" dient als Container, der Referenzen auf die verschiedenen Fenster verwaltet, und "Eval(EvalExpr(...))" wird verwendet, um sicherzustellen, dass das Skript einer bestimmten Schaltfläche nicht den aktuellen "Wert" auswertet, sondern denjenigen, der zum Zeitpunkt der Erstellung im Gültigkeitsbereich vorhanden war.
Betreff: Globale Variablen werden in einer Schleife überschrieben+1. Der Fensterbereich wird hier beschrieben: https://www.jmp.com/support/help/en/19.1/?os=mac&source=application#page/jmp/scoped-names.shtml
Betreff: Globale Variablen werden in einer Schleife überschriebenHallo, vielen Dank! Mein Problem ist gelöst.
Betreff: Globale Variablen werden in einer Schleife überschriebenHallo, vielen Dank für Ihre Antwort, das ist eine weitere Möglichkeit!
Betreff: Globale Variablen werden in einer Schleife überschriebenSie können auch die Funktion „Set“ verwenden und die Schaltflächenreferenz als „Startpunkt“ nutzen.
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>Manchmal kann auch ein Kontextmenü verwendet werden:</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();
Ich nutze all diese Methoden (und die Auswertung von Ausdrücken) je nach Situation.