Essendo un principiante di JSL, mi accorgo spesso di avere difficoltà con l'interpretazione degli script. Se trovo uno script in una discussione che sembra risolvere il mio problema e provo a personalizzarlo, spesso lo rompo e ho difficoltà a capire come risolverlo. Durante il mio percorso di scripting JSL ho fatto molto affidamento su questo forum per assistenza, sia cercando negli archivi estesi le risposte passate, sia chiedendo aiuto se le risposte non sono evidenti. Questo forum è una risorsa inestimabile per imparare JSL e la profondità della conoscenza qui e la volontà di condividere sono sorprendenti.
Di recente, ho giocato con le formule di colonna dinamiche e mi sono imbattuto in un post molto utile di qualche anno fa qui . La soluzione di @txnelson e il suggerimento di follow-up di @NisKorsgaard sono stati piuttosto illuminanti per me. Poiché sono così nuovo di JSL, spesso mi piace "scompattare" il codice per capire cosa fa ogni pezzo. L'ho fatto per il problema di Dynamic Column Formula che avevo. L'esercizio è stato molto utile per me e ho pensato che potesse esserlo anche per altri, quindi ho incluso il codice "scompattato" di seguito.
Lo script non fa nulla di pratico, ma fornisce un semplice esempio di come le formule di colonna possono essere modificate dinamicamente. Spero che qualcuno lo trovi utile.
// 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 );
Questo è un post un po' datato ma è un buon punto di partenza Inserisci un'espressione in un'altra usando Eval Insert, Eval Expr, Parse e Substitute . Quando avrò abbastanza tempo scriverò la mia opinione su queste (espressioni e gestione di esse in alcuni casi diversi) come post del blog.
@jthi , grazie per questo corso introduttivo sulle basi della gestione delle espressioni:
Sessione 9: JSL avanzato 33 min - ...
un'altra grande lezione:
Utilizzo di JSL per sviluppare applicazioni efficienti e robuste (EU 2018 415)
Eval(Substitute()) è uno dei pochi strumenti che dovresti portare con te come un coltellino svizzero per la scrittura di script JSL : )
Gestione delle espressioni in JMP: suggerimenti e trappole
Invece di memorizzare i nomi delle colonne come stringhe e convertirli in "nomi" tramite name , è anche possibile memorizzare i nomi (con o senza ":") e recuperarli e conservarli tramite Name Expr :
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 );