Als JSL-Anfänger habe ich oft Probleme mit der Interpretation von Skripten. Wenn ich in einer Diskussion ein Skript finde, das mein Problem zu lösen scheint, und versuche, es anzupassen, mache ich es oft kaputt und habe Schwierigkeiten, zu verstehen, wie ich es reparieren kann. Während meiner JSL-Skripting-Reise habe ich mich stark auf dieses Forum verlassen – sowohl beim Durchsuchen der umfangreichen Archive nach früheren Antworten als auch beim Bitten um Hilfe, wenn die Antworten nicht offensichtlich waren. Dieses Forum ist eine unschätzbare Ressource zum Erlernen von JSL und die Tiefe des Wissens hier und die Bereitschaft zum Teilen sind erstaunlich.
Ich habe kürzlich mit dynamischen Spaltenformeln herumgespielt und bin dabei auf einen sehr hilfreichen Beitrag von vor ein paar Jahren gestoßen. Die Lösung von @txnelson und der nachfolgende Vorschlag von @NisKorsgaard waren für mich sehr aufschlussreich. Da ich so neu bei JSL bin, möchte ich den Code oft „entpacken“, um herauszufinden, was jedes Teil macht. Ich habe dies für das Problem mit der dynamischen Spaltenformel getan, das ich hatte. Die Übung war für mich sehr hilfreich und ich dachte, sie könnte auch für andere hilfreich sein, daher habe ich den „entpackten“ Code unten eingefügt.
Das Skript hat keinen praktischen Nutzen, bietet aber ein einfaches Beispiel dafür, wie Spaltenformeln dynamisch geändert werden können. Hoffentlich findet es jemand nützlich.
// CALL COLUMN BY REFERRING TO VARIABLE
// See this Discussion for more info:
// From: https://community.jmp.com/t5/Discussions/call-a-column-by-referring-to-variable/td-p/272339
// Original script from @txnelson
//Names Default To Here( 1 );
//dt = Open( "$SAMPLE_DATA/big class.jmp" );
//columnname1 = Column( dt, 4 ) << Get Name;
//columnname2 = Column( dt, 5 ) << Get Name;
//
//Eval(
// Substitute(
// Expr(
// dt << New Column( "new_" || columnname1,
// Numeric,
// continuous,
// formula( __c1__ + __c2__ )
// )
// ),
// Expr( __c1__ ), Parse( ":" || columnname1 ),
// Expr( __c2__ ), Parse( ":" || columnname2 )
// )
//);
// ==================================================
// REVISED SCRIPT
// Pulls apart the above script a bit. For me, this was easier to visualize
// and understand. Also helped clarify how variables work and why the
// EVAL EXPR function is needed. When running script look at the log for changing
// variable contents.
// SETUP
// **************************************************
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnName1 = Column( dt, 4 ) << Get Name;
columnName2 = Column( dt, 5 ) << Get Name;
// FORMULA WITH PLACEHOLDERS
// Create expression with desired formula using placeholders for each variable and store result in var.
// **************************************************
var = Expr(
dt << New Column( "new_" || columnName1, Formula( __c1__ + __c2__ ) )
);
Show (var); // For learning and debugging. Look in log for value of var.
// SWAP OUT PLACEHOLDERS FOR COLUMN NAME STORED IN VARIABLES
// Replace placeholders with variable contents, make them column names and store result in subVar.
// To see the effect of EVAL EXPR, try substituting EVAL (remove EXPR) and re-running the script.
// Look at the log.
// **************************************************
subVar = Substitute(
Eval Expr( var ),
Expr( __c1__ ), As Name( columnName1 ),
Expr( __c2__ ), As Name( columnName2 )
);
Show( subVar); // For learning and debugging. Look in log for value of subVar.
// DO IT
// Make the column with the new formula.
// **************************************************
Eval( subVar );
Dies ist ein etwas älterer Beitrag, aber ein guter Ausgangspunkt . Fügen Sie einen Ausdruck in einen anderen ein, indem Sie Eval Insert, Eval Expr, Parse und Substitute verwenden . Wenn ich genug Zeit habe, werde ich meine Ansicht dazu (Ausdrücke und ihre Handhabung in einigen verschiedenen Fällen) in einem Blogbeitrag niederschreiben.
@jthi , danke für diesen Einführungskurs in die Grundlagen der Ausdrucksbehandlung:
Sitzung 9: Fortgeschrittenes JSL 33 Min. – ...
noch ein toller Vortrag:
Mit JSL effiziente und robuste Anwendungen entwickeln (EU 2018 415)
Eval(Substitute()) ist eines der wenigen Tools, die Sie für JSL-Skripting wie ein Schweizer Taschenmesser bei sich tragen sollten : )
Ausdrucksbehandlung in JMP: Tipps und Falltüren
Anstatt die Spaltennamen als Strings zu speichern und über as name in „Namen“ umzuwandeln, kann man die Namen auch (mit oder ohne ":") speichern – und über Name Expr abrufen und sichern:
dt = Open( "$SAMPLE_DATA/big class.jmp" );
col1 = Name Expr(:height);
col2 = Name Expr(:weight);
new name = "new_" || (col1 << get name);
col1 << set name("tmp"); // we don't care - the reference will still point to the right column
var = Expr(
dt << New Column( new name , Formula( __c1__ + __c2__ ) )
);
var = Substitute( Name Expr(var),
Expr( __c1__ ), Name Expr( col1 ),
Expr( __c2__ ), Name Expr( col2 )
);
/*alternative:
Substitute Into( var,
Expr( __c1__ ), Name Expr( col1 ),
Expr( __c2__ ), Name Expr( col2 )
);*/
Eval( var );