Wie kann man im Graph Builder mithilfe von JSL basierend auf Bedingungen dynamisch X- oder Y-Variablen zuweisen?
Hallo JMP-Community,
I'm trying to build a dynamic Graph Builder report in JSL where the list of X variables is determined by certain conditions (e.g., flags like includeSite, includeWW, etc.). The goal is to flexibly add or remove columns from the X-axis based on runtime logic.
Ich habe mehrere Ansätze ausprobiert, darunter:
X( :ColumnName )
X( Column("ColumnName") )
Expr( X(...) )
Substitute(...) and Eval(...)
Allerdings stoße ich ständig auf Fehler wie:
Name Unresolved: X in access or evaluation of 'X'
Bad Argument( Column(...) )
Ich suche nach einer zuverlässigen und korrekten Methode, um:
-
Definieren Sie dynamisch eine Liste von X-Achsenvariablen
-
Pass them to Graph Builder
-
Vermeiden Sie die Festcodierung der Anzahl der X-Variablen oder die Notwendigkeit, die Builder-Logik zu wiederholen
Hier ist eine vereinfachte Version meines Ziels:
xVars = {};
If( includeSite, Insert Into( xVars, :Site ) );
If( includeWW, Insert Into( xVars, :WW ) );
// add remaining fixed columns...
Graph Builder(
Variables(
// <- How can I inject xVars here properly?
Y( :Measurement )
),
Elements(
Points( Y( :Measurement ) )
)
);
I want to avoid generating multiple separate graph blocks depending on each condition. Is there a supported or recommended way to dynamically build up the X() list for Graph Builder?
Dank im Voraus!
Automatisierung und SkriptingGrundlegende Datenanalyse und -modellierungQualitäts- und ProzesstechnikBetreff: Wie kann ich im Graph Builder mithilfe von JSL basierend auf Bedingungen dynamisch X- oder Y-Variablen zuweisen?Sie können es zunächst mit << Variable hinzufügen versuchen.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(Variables(X(:age), Y(:weight)), Elements(Points(X, Y), Smoother(X, Y)));
Wait(0.5);
gb << Add Variable({:height, Role("Y")});
Wenn das nicht funktioniert, müssen Sie möglicherweise X als Ausdruck erstellen und es dann im Graph Builder auswerten
Betreff: Wie kann ich mithilfe von JSL basierend auf Bedingungen dynamisch X- oder Y-Variablen im Graph Builder zuweisen?Die Verwendung integrierter Funktionen – wie von @jthi vorgeschlagen – ist eine hervorragende Möglichkeit, solche Themen zu behandeln.
Wenn Sie der ursprünglichen Idee folgen möchten, JSL-Code dynamisch zu schreiben, indem Sie Blöcke von JSL-Code (="Ausdrücke") definieren und kombinieren, sehen Sie sich bitte den Blogbeitrag von @Jasean ☝ an.
Mit
Expr( X(...) )
Sie sind nah dran, Ersatz und Bewertung sind weitere Teile des Frameworks.
Die vielleicht wichtigste Funktion: Name Ausdruck() . Mit ihr kann auf den in einer Variable (=name) gespeicherten Ausdruck zugegriffen werden, ohne ihn auszuwerten, z.B. über
y= Expr(X( "ColumnName") );
Name Expr(y);
you will get X( "ColumnName") anstatt

Weitere Ressourcen zur Ausdrucksbehandlung:
Ausdrucksbehandlung in JMP: Tipps und Fallstricke - JMP-Benutzer-Community
Scripters Club, Sitzung 9: Fortgeschrittenes JSL
Funktionen zur Ausdrucksbehandlung: Teil I – Das Rätsel um Expr(), NameExpr(), Eval() usw. lösen
Betreff: Wie kann ich im Graph Builder mithilfe von JSL basierend auf Bedingungen dynamisch X- oder Y-Variablen zuweisen?Mit Hilfe von Ausdruck() , Auswertung() , Ersatz() und Name Ausdruck() ,
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
xVars = Expr(X);
Insert Into( xVars, Expr(:age) );
Eval(Substitute(Expr(Graph Builder(
Variables(
__xVars__,
Y( :height )
)
)
), Expr(__xVars__) , Name Expr(xVars)));
Betreff: Wie kann ich im Graph Builder mithilfe von JSL basierend auf Bedingungen dynamisch X- oder Y-Variablen zuweisen?Anstelle von Ersatz() verwende ich lieber Eval-Ausdruck() - was wie folgt funktioniert
„Suchen Sie nach Ausdruck() und bewerten Sie den Inhalt, bevor Sie das Ganze auswerten“:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
xVars = Expr( X );
Insert Into( xVars, Expr( :age ) );
Eval(
Eval Expr(
Graph Builder(
Variables( Expr( Name Expr( xVars ) ), Y( :height ) )
)
)
);
JMP muss also Folgendes herausfinden:

und wertet es aus. Beachten Sie den Namen Expr() . Wie im vorherigen Beitrag besprochen, stellt dies sicher, dass JMP den Inhalt von xVars nur abfragt und nicht auswertet. Nach dem Abrufen und Einfügen des Blocks in den Hauptblock wird das Ganze über das umschließende

Ein guter Trick, um zu überprüfen, was los ist: Lassen Sie das umschließende Auswertung() weg und sehen Sie sich das Protokoll an.
Anschließend gibt JMP den vorgefertigten Ausdruck im Protokoll aus – ohne ihn auszuwerten. Dies ermöglicht dem Benutzer, den endgültigen Ausdruck einzusehen und auf Fehler zu prüfen:

Wenn alles wie erwartet ist, fügen Sie einfach die Auswertung() hinzu, um den Ausdruck auszuwerten.