Fügen Sie einen Ausdruck in einen anderen ein, indem Sie Eval Insert, Eval Expr, Parse und Substitute verwendenProblemSie müssen den Wert einer Variablen einfügen in einen Ausdruck umwandeln ohne den gesamten Code auszuwerten.Beispiele beinhalten:
- Spaltenformeln mithilfe eines Skripts schreiben
- Skripte mit einem anderen Skript schreiben
Unten finden Sie ein Skript zum Transformieren der ausgewählten Spalten in einer Tabelle. Das macht NICHT funktioniert, da in der Spaltenformel anstelle des Spaltennamens der Ausdruck „cols[i]“ gespeichert wird.
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//This code does not work
For( i = 1, i <= N Items(cols), i++,
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( cols[i] ) * 2)
)
);
Neue Spalten werden mit dem richtigen Namen erstellt, aber mit dieser Formel:

Lösung
Es gibt zwei allgemeine Strategien, um dieses Problem zu lösen: Erstellen des Ausdrucks, während ein Teil davon vor dem Rest ausgewertet wird, und Erstellen des Ausdrucks als Zeichenfolge und anschließende Auswertung. Beachten Sie, dass die eingefügte Variable tatsächlich ein Ausdruck beliebiger Länge sein kann.
Ausdrücke
Bei diesen Methoden wird ein Ausdruck geschrieben und ein Teil davon vor dem Rest ausgewertet. Es kann schwierig sein, die richtige Kombination aus Eval, Eval Expr und Expr zu finden, aber Sie können die Syntaxhervorhebung sehen und mit dem Skripteditor sicherstellen, dass die Klammern übereinstimmen.
Eval, Eval Expr
Schreiben Sie den Ausdruck und schließen Sie alle Teile, die sofort ausgewertet werden sollen, mit Expr() ein:
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( Expr( Char( cols[i] ) ) ) * 2)
)
) )
);
Ersatz
Schreiben Sie den Ausdruck und ersetzen Sie einen Teil davon durch ausgewerteten Code:
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Substitute(
Expr( dt << New Column(
"2 * " || cn,
Numeric,
"Continuous",
Formula( As Column( cn ) * 2)
) ),
Expr( cn ),
Char( cols[i] )
) )
);
String-Methoden
Bei diesen Methoden wird der Ausdruck als String geschrieben, Parse() verwendet, um ihn in einen Ausdruck umzuwandeln, und dann Eval(), um ihn tatsächlich auszuwerten. Zu den Nachteilen dieser Methoden gehört, dass keine Syntaxhervorhebung angezeigt wird, doppelte Anführungszeichen mit \!" oder \[ ... ]\ verarbeitet werden müssen und dass es im Allgemeinen schwierig ist, Fehler zu beheben oder in Zukunft zu ändern, insbesondere bei langen Ausdrücken.
Evaluierungseinlage
Schreiben Sie den Ausdruck als Zeichenfolge mit Inline-Code, der ausgewertet und in die Zeichenfolge eingefügt wird, und analysieren Sie ihn dann und werten Sie ihn aus:
//Eval Insert
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Eval Insert(
"\[dt << New Column(
"2 * ^Char( cols[i] )^",
Numeric,
"Continuous",
Formula( As Column( "^Char( cols[i] )^" ) * 2)
)]\"
) ) );
);
Ersatz
Schreiben Sie den Ausdruck in eine Zeichenfolge mit einem Platzhalter, der durch den ausgewerteten Ausdruck ersetzt wird. Beachten Sie, dass dies die gleiche Funktion wie oben ist:
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"2 * ColumnName",
Numeric,
"Continuous",
Formula( As Column( "ColumnName" ) * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
Verketten
Die einfachste Form: Schreiben Sie den Ausdruck mit „||“.Beachten Sie, dass Sie \[ ... ]\ anstelle von \!" verwenden können:
//Concatenate
For( i = 1, i <= N Items(cols), i++,
Eval( Parse(
"dt << New Column(
\!"2 * " || Char( cols[i] ) || "\!",
Numeric,
\!"Continuous\!",
Formula( As Column( \!"" || Char( cols[i] ) || "\!" ) * 2)
)"
) );
);
Siehe auch
Der Abschnitt „Funktionen zur Ausdrucksverarbeitung“ des Skripthandbuchs enthält diese und andere Methoden, um dasselbe zu erreichen.Dieser Blogbeitrag von @Joseph Morgan hat zusätzliche Beispiele und Einblicke in das gleiche Thema.
Danke @Justin_Chilton für Feedback zu diesem Beitrag.
Fügen Sie Variablen oder Ausdrücke in andere Ausdrücke ein.Dies ist eine kurze Einführung in Eval(), Eval Expr(), Substitute(), Parse() und Eval Insert().
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einHier ist ein Beispiel für eine Ausdrucksmethode und eine String-Methode:
Names default to here(1);
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"Eval Expr 2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( Expr( cols[i] ) * 2 )
)
) )
);
//Substitute with String
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"Substitute String 2 * ColumnName",
Numeric,
"Continuous",
Formula( :"ColumnName"n * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einDies könnte dort einige unnötige Funktionen haben, aber Sie können Name Expr mit Spaltenreferenz (As Column(name)) verwenden:
Names Default To Here(1);
//Open A Table and select a few columns
dt = Open("$Sample_data/iris.jmp");
cols = {Sepal length, Petal length};
For(i = 1, i <= N Items(cols), i++,
Eval(Eval Expr(dt << New Column("2 * " || Char(cols[i]), Numeric, "Continuous", Formula(Expr(Name Expr(As Column(Char(cols[i])))) * 2))))
);
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einGibt es eine Möglichkeit, bei der As Column() nicht benötigt wird?
Hier müssen wir es einfügen, während wir einen String übergeben. Ich frage mich, wie das geht, damit die Formel mit :column übrig bleibt.
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einVielen Dank! Ja. Mit dem Schleifenstart hast du recht. Das war mir nicht klar.
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen ein@Grünschnabel ,
Die for-Schleife beginnt mit i=2, deshalb wurde die erste Spalte übersprungen und beim Erstellen der Datentabelle wurde eine einzelne leere Spalte namens Spalte 1 erstellt. Sie können dies beheben, indem Sie die Schleife mit i=1 beginnen und anschließend Spalte 1 löschen, etwa so:
Mehr sehen... Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einHallo,
Es funktionierte für die Spalten b und c. „a“ erscheint nicht. Stattdessen erscheint eine leere Spalte 1.
Deshalb habe ich versucht, die „for-Schleife“ in die New Table() einzufügen. Aber mit diesem Ansatz erhalte ich nur den Ausdruck innerhalb der Formel.
Wissen Sie, wie man mit der „for-Schleife“ mit der Formel in New Table() umgeht, um alle erforderlichen Spalten auf einmal zu erhalten?
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einHallo @Grünschnabel ,
Sie müssen JMP anweisen, diesen Ausdruck auszuwerten, bevor Sie ihn in die Formel einfügen, da es, sobald es in einer Spaltenformel ist, nicht mehr weiß, wie es auf Ihre andere Tabelle verweisen soll. Mit meiner bevorzugten Methode (oben oben) könnte es etwa so aussehen:
Names Default To Here( 1 ); //
//Table with columns you want to create
mydt = New Table( "Source",
Add Rows( 3 ),
New Column( "Name", Character, "Nominal", Set Values( {"a", "b", "c"} ) ),
New Column( "Mean", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 3] ) ),
New Column( "Std Dev", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [0.5, 0.6, 0.7] ) )
);
my_newdt = New Table( "Target", Add Rows( 100 ) );
// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
Eval( Eval Expr(
my_newdt << New Column( Column( mydt, 1 )[i],
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Expr( As Column( mydt, :Mean )[i] ), Expr( As Column( mydt, :Std Dev )[i] ) ) )//
)
) )
);
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einErstellen einer Tabelle mit Formel in den Spalten – Random Normal() – aus externem JMP
Ich habe bereits eine funktionierende Lösung für mein Problem. Link oben.
Ich bin jedoch bestrebt, dass mein Code ordnungsgemäß funktioniert.
Und dieser Thread scheint auf mein Thema zu reagieren.
Ich habe einige der oben genannten Techniken ausprobiert. Aber es funktioniert nicht oder ich verstehe es nicht.
Haben Sie einen Vorschlag für mich? Wie bekomme ich Ausdruck?“ Als Spalte( mydt, :Mean )[1] „zu Quellwerten aufgelöst?
//not working
Clear Globals();
Names Default To Here( 1 ); //
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name",
// Add Rows( N Rows( mydt ) ), // row count can be set by hand e.g. 1000
Add Rows( 10 ), // row count can be set by hand e.g. 1000
New Column( Column( mydt, 1 )[1], // Loop i==1
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( As Column( mydt, :Mean )[1], 0.01))// As Column(mydt, :Mean )[1] is evalueted in the target table. But Formula has the expression "As Column( mydt, :Mean )[1]" instead of a value from source table
)
);// End New data table
/*// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
my_newdt << New Column( Column( mydt, 1 )[i], // Loop i ==2
Numeric,
"Continuous",
Format( "Best", 6 ),
Set Each Value( Random Normal( As Column( mydt, :Mean )[i], As Column( mydt, :Std Dev )[i] ) )//
)
)// End for loop;
;*/
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einSehr hilfreich!
Betreff: Fügen Sie einen Ausdruck mit Eval Insert, Eval Expr, Parse und Substitute in einen anderen einHervorragender Überblick über die verfügbaren Methoden zum dynamischen Erstellen von JSL-Ausdrücken.Meistern Sie dies und alles ist ziemlich einfach.