Quelques informations sur les formules de colonnes dynamiquesEn tant que débutant en JSL, je me retrouve souvent confronté à des difficultés d'interprétation de scripts. Si je trouve un script dans une discussion qui semble résoudre mon problème et que j'essaie de le personnaliser, je le casse souvent et j'ai du mal à comprendre comment le réparer. Au cours de mon parcours de scripteur JSL, je me suis beaucoup appuyé sur ce forum pour obtenir de l'aide - à la fois pour rechercher dans les archives complètes des réponses passées et pour demander de l'aide si les réponses ne sont pas évidentes. Ce forum est une ressource inestimable pour l'apprentissage du JSL et la profondeur des connaissances ici et la volonté de partager sont étonnantes.
Récemment, j'ai joué avec des formules de colonnes dynamiques et je suis tombé sur un article très utile d'il y a quelques années ici . La solution de @txnelson et la suggestion de suivi de @NisKorsgaard m'ont été très révélatrices. Comme je suis si nouveau dans JSL, j'aime souvent « décompresser » le code pour comprendre ce que fait chaque élément. Je l'ai fait pour le problème de formule de colonne dynamique que j'avais. L'exercice m'a été très utile et j'ai pensé qu'il pourrait également l'être pour d'autres, j'ai donc inclus le code « décompressé » ci-dessous.
Le script n'a rien de pratique mais fournit un exemple simple de la manière dont les formules de colonne peuvent être modifiées de manière dynamique. J'espère que quelqu'un trouvera cela 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 );
Automatisation et scriptsRé: Quelques informations sur les formules de colonnes dynamiquesIl s'agit d'un article un peu ancien mais qui constitue un bon point de départ . Insérez une expression dans une autre à l'aide de Eval Insert, Eval Expr, Parse et Substitute . Lorsque j'aurai suffisamment de temps, j'écrirai mon point de vue sur ces expressions (expressions et leur gestion dans quelques cas différents) dans un article de blog.
Ré: Quelques informations sur les formules de colonnes dynamiques@jthi , merci pour ce cours d'introduction aux bases de la gestion des expressions :
Séance 9 : JSL avancé 33 min - ...
une autre grande conférence:
Utilisation de JSL pour développer des applications efficaces et robustes (UE 2018 415)
Eval(Substitute()) est l'un des rares outils que vous devriez emporter comme un couteau suisse pour les scripts JSL : )
Gestion des expressions dans JMP : astuces et trappes
Ré: Quelques informations sur les formules de colonnes dynamiquesAu lieu de stocker les noms de colonnes sous forme de chaînes et de les convertir en « noms » via as name , on peut également stocker les noms (avec ou sans ":") - et les récupérer et les conserver via 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 );