JSL-Skripting für die dynamische Spaltenzuordnung im Graph-BuilderIch versuche, ein Sitzungsskript zu erstellen, um mit dem Graph Builder von JMP Diagramme zu generieren. Dabei stellt sich jedoch die Schwierigkeit, dass die Anzahl der Spalten in meinen Daten je nach Aktualisierungszeitraum variiert, was eine manuelle Anpassung des Graph-Builder-Skripts für jede Aktualisierung erforderlich macht.
To address this, I am considering a method where column names are prefixed (e.g., A_, B_, C_). This would allow me to dynamically assign columns: for instance, columns prefixed with A_ could be directed to the Local Data Filter, those with B_ to the Column Switcher, and so forth.
Ich würde gerne wissen, wie dieser Ansatz in JSL (JMP Scripting Language) umgesetzt werden kann, da ich selbst noch kein effektives Skript schreiben konnte. Sie erwähnten einen unvollständigen JSL-Entwurf, der jedoch nicht in Ihrer Aufgabenstellung enthalten war. Falls Sie mir den Entwurf zukommen lassen könnten, helfe ich Ihnen gerne bei der Überarbeitung oder schlage Ihnen eine Lösung vor.
Ich stoße außerdem auf folgenden Fehler.→[For Each , Bad Argument( colName ), For Each/*###*/(colName, columnNames,... Das Argument muss eine Liste sein. ]
dt = Current Data Table();
A_list = {};
B_list = {};
columnNames = As List(dt << Get Column Names("String"));
For Each(colName, columnNames,<BR />
If(Contains(colName, "A_"),
Insert Into(A_list, colName)
);
If(Contains(colName, "B_"),
Insert Into(B_list, colName)
);
);
Graph Builder(
Variables(
X( :point ),
Y( :avg ),
Y( :stddev ),
Page( :category ),
Color(B_list[1])
),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Legend( 27 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 29 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Legend( 28 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 31 ) )
),
Local Data Filter(
Conditional,
Add Filter(
columns( A_list ),
Display( A_list[1], N Items( 7 ), Find( Set Text( "" ) ) ),
Display( A_list[2], N Items( 7 ) ),
Display( :key, N Items( 12 ) )
)
),
Column Switcher(
:msr_dt,
B_list
)
);
Automatisierung und SkripterstellungBetreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderHaben Sie Spalten-Tags in Betracht gezogen, um die Spalten zu "gruppieren"?
Dies könnte eine ähnliche Funktionalität bieten – und es ermöglicht sogar überlappende „Gruppen“.
Etwa so:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt:sex << setProperty( "Tags", {"pick"} );
dt:height << setProperty( "Tags", {"pick"} );
dt:weight << setProperty( "Tags", {"pick"} );
cols = dt << Get Tagged Columns( "pick" );
dt << Distribution( Column( Eval(cols) ));
Übrigens, es gilt für jedes ({col}, cols, body)
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph Builder
Vielen Dank für deine Antwort, hogi.
Ich hatte Spaltentags nicht berücksichtigt. Ich werde versuchen, das Skript mithilfe von Spaltentags noch einmal zu überarbeiten.
Ich werde antworten, sobald ich das erledigt habe.
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderJe nach Anwendungsfall können Sie Tags wie bereits vorgeschlagen, benutzerdefinierte Spalteneigenschaften, Spaltennamen mit Präfix, Spaltengruppen usw. verwenden. Alle Optionen haben ihre Vor- und Nachteile.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << Get Column Names("String");
npn_cols = Filter Each({colname}, collist, Starts With(colname, "NPN"));
pnp_cols = Filter Each({colname}, collist, Starts With(colname, "PNP"));
gb = dt << Graph Builder(
Variables(X(:SITE), Y(:IVP1), Color(pnp_cols[1])),
Elements(
Position(1, 1),
Points(X, Y(1), Legend(27))
),
Elements(
Position(1, 2),
Points(X, Y(1), Legend(28)),
Line(X, Y(2), Y(3), Color(0), Legend(31))
)
);
filter_cols = npn_cols[1::2];
Insert Into(filter_cols, "SITE");
ldf = gb << Local Data Filter(
Conditional,
Add Filter(
columns(Eval(filter_cols)),
Display(filter_cols[1]),
Display(filter_cols[2]),
Display(filter_cols[3])
)
);
cw = gb << Column Switcher(pnp_cols[1], pnp_cols);
Ist das etwa eine Art Hybrid aus Community-Frage und LLM-Aufgabe (wir sind hier in der Community ja schließlich auch nur Menschen)?
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderBitte entschuldigen Sie, dass meine Antwort auf Japanisch ist (ich dachte, dies würde meine wahren Absichten besser vermitteln).
Wir teilen nun mit der Community Fälle, in denen Fragen an JMP learnBot nicht beantwortet werden konnten.
Letztendlich nutze ich diese Community, um meine eigenen Skripting-Fähigkeiten zu verbessern, indem ich etwas über Skripting-Methoden lerne und Ratschläge von sachkundigen Personen erhalte, und um auch zur Kompetenzentwicklung anderer JMP-Benutzer in meinem Umfeld beizutragen.
Es tut mir sehr leid, da ich befürchte, jthi, die meine Fragen stets so freundlich beantwortet, beleidigt zu haben. Sollte meine Frage unhöflich oder unangemessen gewesen sein, wäre ich Ihnen dankbar, wenn Sie mich darauf hinweisen könnten, damit ich dies in Zukunft berücksichtigen kann.
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderIch habe mich durch deinen Beitrag nicht beleidigt gefühlt, sondern eher irritiert, da es sich so anfühlte, als würden wir hier zu etwas aufgefordert. Ich würde dir dringend empfehlen, die Aufforderung zu entfernen, falls du eine verwendet hast.
LearnBot ist mit JSL nicht wirklich gut, da es nicht auf diese Weise angeleitet wird. Der Assistant ist möglicherweise etwas besser, aber Sie erzielen bessere Ergebnisse, wenn Sie LLM (z. B. Claude, idealerweise einen, auf den Ihr Unternehmen Zugriff hat) anleiten, damit es versteht, was es tun soll (JSL).
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderWie Jthi bereits angemerkt hat, hatte ich in meinem Kopf nicht klar zwischen den Aufgabenstellungen für LLM und den Beiträgen in der JMP-Benutzergemeinschaft unterschieden.
Zukünftig werde ich die Inhalte sorgfältig prüfen, um zu entscheiden, ob es sich um eine Frage für LLM oder einen passenden Beitrag für die JMP-Nutzergemeinschaft handelt. Vielen Dank für den Hinweis auf wichtige Aspekte, die für eine reibungslosere Kommunikation zu berücksichtigen sind.
Ich freue mich auf Ihre weitere Unterstützung.
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderFalls Sie wissen möchten, wie das Skript selbst funktioniert, finden Sie hier eine aktualisierte Version, die Ihnen den Einstieg erleichtert. Ich habe einige geänderte Abschnitte kommentiert. Beachten Sie, dass der komplexeste Abschnitt das Einfügen einer Spaltenliste in den lokalen Datenfilter beinhaltet, was die Funktionen `Eval(Eval Insert())` auslöst. Weitere Optionen hierfür finden Sie unter „Ausdrücke mithilfe von Eval Insert, Eval Expr, Parse und Substitute einfügen“ .
Names default to here(1);
Random reset(1);
msr_dt = New Table( "Example Data",
Add Rows( 200 ),
New Column( "A_1", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "ABC", floor(Random uniform( 4 )),1) ))),
New Column( "A_2", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "DEF", floor(Random uniform( 4 )),1) ))),
New Column( "B_1", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "GHI", floor(Random uniform( 4 )),1) ))),
New Column( "B_2", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "JKL", floor(Random uniform( 4 )),1) ))),
New Column( "point", Numeric, "Continuous", Format( "Best", 12 ), Formula( Row() ) ),
New Column( "avg", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal( 5 ) ) ),
New Column( "stddev", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal( 0.5 ) ) ),
New Column( "category", Character, "Nominal", Formula( Char( Floor( Row() / 101 ) ) ), Set Selected ),
New Column( "key", Character, "Nominal", Formula( Substr( "abcdefghijklmnopqrstufwxyz", floor(Random uniform( 27 )),1) )),
);
A_list = {};
B_list = {};
columnNames = As List(msr_dt << Get Column Names("String"));
For Each({colName},columnNames, // change here - note brackets
If(Contains(colName, "A_"),
Insert Into(A_list, colName)
);
If(Contains(colName, "B_"),
Insert Into(B_list, colName)
);
);
Eval(Eval expr(
Graph Builder(
Variables(
X( :point ),
Y( :avg ),
Y( :stddev ),
Page( :category ),
Color(B_list[1])
),
Show Control Panel( 0 ),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Legend( 27 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 29 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Legend( 28 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 31 ) )
),
Local Data Filter(
Conditional,
Add Filter(
columns( Expr( A_list || {"key"} ) ), //this needs to be evaluated before the graph builder function is called
Display( A_list[1], N Items( 7 ) ), //removed the find term
Display( A_list[2], N Items( 7 ) ),
Display( :key, N Items( 12 ) )
)
),
Column Switcher(
B_list[1], // added reference to specific column here - was the data table
B_list
)
)
));
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderIch bin ein JSL-Neuling, also verzeiht mir bitte, falls diese Frage schon einmal gestellt und beantwortet wurde.
Ich möchte das obige Graph-Builder-Skript so anpassen, dass es IVP-Spalten gegen NPN-Spalten mit den Farben der PNP-Spalten darstellt. Das angepasste Skript (Multiple Column Switcher.jsl) mit drei Spaltenumschaltern ist beigefügt. Ich muss die gewünschten Kombinationen von IVP-, NPN- und PNP-Spalten manuell auswählen. Wenn ich weiß, dass die IVP-, NPN- und PNP-Spalten jeweils 1:1 zugeordnet sind (z. B. IVP3 vs. NPN3 und PNP3), wie kann ich das mit einem einzigen Spaltenumschalter realisieren?
Betreff: JSL-Skripting für die dynamische Spaltenzuordnung im Graph BuilderIch hatte eine vereinfachte Version davon in meiner Tipps-und-Tricks-Präsentation auf dem Discovery Summit ( Überspringen, Hüpfen und JMP in einer Minute: JMP-Tipps im Miniformat von einem Superuser (2026-EU-30MP-2767) , Tipp „Spaltenwechsler für alle (Mehrfachspaltenwechsler)“).
Dies ist eine recht einfache Methode (beachten Sie jedoch, dass NPN mehr Spalten hat als die anderen, sodass in diesem Fall die falsche Spalte verwendet wird).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << Get Column Names("String");
npn_cols = Filter Each({colname}, collist, Starts With(colname, "NPN"));
pnp_cols = Filter Each({colname}, collist, Starts With(colname, "PNP"));
ivp_cols = Filter Each({colname}, collist, Starts With(colname, "IVP"));
gb = dt << Graph Builder(
Variables(X(:NPN1), Y(:IVP1), Color(pnp_cols[1])),
Elements(
Position(1, 1),
Points(X, Y(1), Legend(27))
),
Elements(
Position(1, 2),
Points(X, Y(1), Legend(28)),
Line(X, Y(2), Y(3), Color(0), Legend(31))
)
);
cw1 = gb << Column Switcher(npn_cols[1], npn_cols);
cw2 = gb << Column Switcher(pnp_cols[1], pnp_cols);
cw3 = gb << Column Switcher(ivp_cols[1], ivp_cols);
Eval(EvalExpr(
post = Function({previousColumn, currentColumn, switcher},
c2 = Substitute((currentColumn << get name), "NPN", "PNP");
c3 = Substitute((currentColumn << get name), "NPN", "IVP");
Expr(cw2) << Set Current(c2);
Expr(cw3) << Set Current(c3);
);
));
handler = cw1 << Make Column Switch Handler(post);
// might want to hide other column switchers
cw_obs = (Report(gb) << Top Parent) << XPath("//ColumnSwitcherContextOutlineBox");
cws = cw_obs << Get Scriptable Object;
cw_obs[2] << Visibility("Collapse");
cw_obs[3] << Visibility("Collapse");
Write();
Eine gestapelte Datentabelle und ein lokaler Datenfilter können für solche Fälle ebenfalls eine gute Option sein.