Das Auffordern des Benutzers zur Spaltenauswahl ist eine sehr häufige Aufgabe in JMP -Skripten. Bei der Vorbereitung des Skripts sollten Sie einige Punkte beachten, um die beste Methode zu ermitteln.
Überlegen Sie sich zunächst, wie Ihr Fenster aussehen soll. Soll der Benutzer neben der Spaltenauswahl auch andere Optionen festlegen können? Und vor allem: Wie soll sich das Fenster verhalten?
Modale vs. nicht-modale Fenster
Ein modales Fenster führt dazu, dass das Skript anhält und auf eine Benutzerinteraktion wartet. Sobald der Benutzer mit dem Fenster interagiert und es schließt, wird der Rest des Skripts ausgeführt. Ein Beispiel für ein modales Fenster ist das Einstellungsfenster (Datei > Einstellungen). JMP führt keine weiteren Aktionen aus, bis das Einstellungsfenster geschlossen wird.
Bei einem nicht-modalen Fenster bleibt dieses geöffnet und das Skript kann ohne Benutzerinteraktion ausgeführt werden. Denken Sie beispielsweise an das Startfenster der Fit-Model-Plattform (Analysieren > Fit Model). Sie können das Fenster geöffnet lassen und in JMP weitere Aufgaben erledigen. Es gibt sogar eine Option, den Dialog nach der Erstellung der Analyse geöffnet zu lassen. Dies ist ein Beispiel für ein nicht-modales Fenster. Sie könnten ein solches Fenster verwenden, damit Ihre Benutzer Spalten und Rollen anders auswählen können.
Wie entscheidet man also, ob man ein modales oder ein nicht-modales Fenster verwendet? Die wichtigste Überlegung ist, ob JMP auf die Benutzereingabe warten soll oder nicht. Wenn der restliche Ablauf des Skripts von den Benutzerauswahlen abhängt, empfiehlt sich ein modales Fenster. Da es zwei nützliche Methoden zur Erstellung modaler Fenster gibt, wollen wir uns die Optionen genauer ansehen.
Spaltendialog()
Die Funktion `ColumnDialog()` ist eine integrierte Funktion, mit der Sie schnell einen modalen Dialog erstellen können, in dem Benutzer Spalten aus der aktuellen Datentabelle auswählen können. Der Skriptautor wählt lediglich die Anzeigefeldtypen aus, hat aber wenig Einfluss auf das Layout. Hier ist ein Beispielskript, das den Benutzer auffordert, zwei X-Spalten und zwei Y-Spalten auszuwählen.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
dlg = Column Dialog(
yList = Col List( "Y",
Min Col( 2 ),
Max Col( 2 ),
Data Type( "Numeric" )
),
effectList = Col List( "Effects",
Min Col( 2 ),
Max Col( 3 ),
Data Type( "Numeric" )
)
);
Das dem Benutzer angezeigte Fenster sieht folgendermaßen aus:

Beachten Sie, dass der Skriptautor nur die Optionen für die beiden Spaltenlisten-Anzeigefelder bereitgestellt hat. Die Spaltenliste der aktuellen Datentabelle auf der linken Seite wird als Teil der integrierten Funktionalität angezeigt.
Nachdem der Benutzer seine Auswahl getroffen und auf OK geklickt hat, wird ihm eine Liste seiner Auswahl angezeigt, etwa so:
dlg = {yList = {:Age, :Oxy}, effectList = {:RunPulse, :RstPulse}, Button(1)};
Die einzelnen Ausdrücke in der Liste werden nicht ausgewertet. Um die ausgewählten Spalten zu verwenden, können Sie die Spaltenliste auf verschiedene Arten für Ihre Analyse extrahieren. Beispielsweise können Sie die Variable `dlg list` indizieren und die Spaltenliste einer neuen Variable zuweisen, oder Sie können denselben Namen verwenden.
yList = dlg["yList"];
effectList = dlg["effectList"];
Eine weitere Methode zum Entladen der Spaltenliste besteht darin, die Elemente der Variablen `dlg` mithilfe von `Eval List()` auszuwerten. Das letzte Element der Liste `dlg` wird vor der Auswertung der übrigen Elemente entfernt, da `Button(1)` nicht ausgewertet werden muss.
Eval List( Remove( dlg, -1 ) )
Wenn Sie nun Symbole anzeigen () ausführen, sehen Sie alle definierten Variablen und dass die Spaltenauswahlen in den Variablen yList und effectList gespeichert sind.
// Here
dlg = {yList = {:Age, :Oxy}, effectList = {:RunPulse, :RstPulse}, Button( 1 )};
dt = Data Table( "Fitness" );
effectList = {:RunPulse, :RstPulse};
yList = {:Age, :Oxy};
// 4 Here
Beide Methoden zum Entladen der Werte ermöglichen es Ihnen, die Variablen yList und effectList in Ihrer Analyse zu verwenden:
fm = dt << Fit Model(
Y( Eval( yList ) ),
Effects( Eval( effectList ) ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run
);
Was sind also die wichtigsten Überlegungen bei der Verwendung von Column Dialog()?
- Ein Spaltenauswahlfeld für die Spalten der aktuellen Datentabelle ist immer vorhanden. Dies ist zwar praktisch, wenn der Benutzer Spalten auswählen soll, schränkt aber die Verwendung dieses Modal-Fenstertyps ein.
- Der zu schreibende Skriptcode ist recht kurz. Die integrierten Funktionen dürften Ihre Anforderungen bereits vollständig erfüllen. Die Anpassungsmöglichkeiten sind jedoch begrenzt. Beispielsweise stehen nur drei Konstruktoren zur Verfügung, um die Anordnung der Anzeigefelder im Fenster zu steuern: HList(), VList() und Line Up Box().
- Der von `ColumnDialog()` zurückgegebene Wert ist konsistent. Als Skriptautor wissen Sie, dass `ColumnDialog()` immer eine Liste von Werten zurückgibt, die extrahiert werden müssen. Der Nachteil besteht darin, dass ein zusätzlicher Schritt zum Entladen der Werte erforderlich ist und die Flexibilität beim Abrufen der Benutzerauswahl eingeschränkt ist.
Eine vollständige Liste der für Column Dialog() verfügbaren Konstruktoren finden Sie im Abschnitt „Konstruktoren für Spaltendialoge“ des Kapitels „Anzeigebäume“ im Skripthandbuch .
Neues Fenster()
Die integrierte Funktion `New Window()` ermöglicht das Erstellen modaler oder nicht-modaler Fenster, die für verschiedene Zwecke genutzt werden können – von der Aufforderung zur Spaltenauswahl bis hin zur Anzeige wichtiger Informationen. Dank der Vielzahl verfügbarer Anzeigefelder lassen sich mit `New Window()` sehr individuelle modale Fenster gestalten.
Mit den erweiterten Anpassungsmöglichkeiten steigt auch der zu schreibende Codeumfang. Das folgende Beispiel zeigt ein ähnliches Fenster wie den oben gezeigten Spaltendialog. Beachten Sie, dass einige Anzeigefelder ähnliche Namen haben. Beispielsweise dienen V-Listenfeld, H-Listenfeld, Panelfeld und Zeilenfeld der Steuerung des Fensterlayouts. Die übrigen Anzeigefelder enthalten die im Fenster sichtbaren Elemente wie Schaltflächen und die Spaltenliste.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
nw = New Window( "Launch Dialog",
<
<MODAL>
V List Box( Align( "right" ),
<STRONG>H List Box</STRONG>(
<STRONG>Panel Box</STRONG>( "Select Columns", clb = Filter Col Selector( dt, all ) ),
<STRONG>Panel Box</STRONG>( "Cast Selected Columns into Fit Model Roles",
<STRONG>Lineup Box</STRONG>( N Col( 2 ), Spacing( 5 ), Button Box( "Y", clbY << Append( clb << Get Selected ) ), clbY = Col List Box( "Numeric", MinItems( 2 ), MaxItems( 2 ), nlines( 3 ) ), Button Box( "Effects", clbEffects << Append( clb << Get Selected ) ), clbEffects = Col List Box( "Numeric", MinItems( 2 ), MaxItems( 3 ), nlines( 4 ) ), Button Box( "Remove", clbY << Remove Selected; clbEffects << Remove Selected; ) ) ) ),
<STRONG>H List Box</STRONG>( Button Box( "OK", yVars = clby << Get Items( "Column Reference" ); eVars = clbEffects << Get Items( "Column Reference" ); ), Button Box( "Cancel" ) ) ) );
</MODAL>
Das dem Benutzer angezeigte Fenster sieht folgendermaßen aus:

In diesem Beispielfenster werden die ausgewählten Spalten JSL-Variablen im OK-Button zugewiesen. Alternativ könnten die Spalten auch in den Button-Skripten für die Schaltflächen „Y“ und „Effekte“ zugewiesen werden. Das ist richtig. Da der Benutzer die Spalten jedoch per Drag & Drop in die Spaltenlistenfelder ziehen kann, werden diese Schaltflächen möglicherweise nie angeklickt. Das Button-Skript würde dann nie ausgeführt. Alternative Methoden finden Sie im Abschnitt „ Werte aus einem Fenster extrahieren“ des Kapitels „Schaubäume“ im Skripting-Leitfaden .
Der Befehl „ Zeigen ( yVars, eVars );“ listet die Werte im Protokoll auf (Ansicht > Protokoll):
yVars = {:Age, :Oxy};
eVars = {:RunPulse, :RstPulse};
Diese Variablen können beim Start des Fit-Modells verwendet werden, ohne dass sie entladen werden müssen.
fm = dt << Fit Model(
Y( Eval( yVars ) ),
Effects( Eval( eVars ) ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run
);
Lassen Sie sich nicht von der Menge an Skriptcode abschrecken. Sehen wir uns stattdessen einige der Anpassungsmöglichkeiten dieses modalen New Window()-Fensters an. Die folgenden Elemente entsprechen den Nummern im obigen Bild.
- Die Funktion „New Window()“ ermöglicht es Ihnen, einen für Ihr Skriptprojekt aussagekräftigen Fenstertitel anzugeben. In diesem Beispiel wird der einfache Titel „Dialog starten“ verwendet.
- Der über den Gruppierungen angezeigte Text kann angepasst werden. So können Sie dem Benutzer eine kurze Anweisung oder Beschreibung der Gruppierung bereitstellen.
- Die Anzahl der anzuzeigenden Zeilen kann als optionales Argument für die Funktion `Col ListBox()` angegeben werden, die die ausgewählten Spalten enthält. Dadurch lässt sich die Anzahl der im Anzeigefeld erscheinenden Spalten steuern. Wie oben gezeigt, kann außerdem zusätzlicher Platz aus ästhetischen Gründen hinzugefügt werden.
- Die Spaltenliste kann aus jeder geöffneten Datentabelle stammen, nicht nur aus der aktuell geöffneten. Beachten Sie, dass die Funktion „Neues Fenster()“ für verschiedene Dialognachrichten verwendet werden kann. Daher ist die Anzeige der Spaltenliste optional.
- Die OK-Schaltfläche kann eine benutzerdefinierte Funktion haben. Die Abbrechen-Schaltfläche ist optional.
Die Funktion `New Window()` bietet weitaus mehr Konstruktoren als hier gezeigt wurden, darunter Schieberegler, Optionsfelder, Bilder, Diagramme und vieles mehr! Eine Liste der für `New Window()` verfügbaren Konstruktoren finden Sie im Abschnitt „ Anzeigefelder für neue Fenster erstellen“ des Kapitels „Schaubäume“ im Skripting-Leitfaden .
Zusammenfassend lässt sich sagen, dass Column Dialog() zwar eine schnelle und einfache Möglichkeit bietet, Ihr Fenster zu erstellen, jedoch nur eingeschränkte Anpassungsmöglichkeiten bietet. Ein modales New Window() hingegen bietet deutlich mehr Flexibilität bei der Anpassung, erfordert aber mehr Überlegung und Skripting. Beide Optionen haben ihre Vorteile, und ich bin sicher, dass Sie für jede von ihnen Verwendung finden werden. Zum Glück ist in Ihrem Werkzeugkasten Platz für beide!