Insérez une expression dans une autre à l'aide d'Eval Insert, Eval Expr, Parse et SubstituteProblèmeVous devez insérer la valeur d'une variable dans une expression sans évaluer tout le code.Les exemples comprennent:
- Écrire des formules de colonnes à l'aide d'un script
- Écrire des scripts à l'aide d'un autre script
Vous trouverez ci-dessous un script pour transformer les colonnes sélectionnées en tableau. Cela fait PAS fonctionne, car l'expression 'cols[i]' est enregistrée dans la formule de colonne au lieu du nom de la colonne.
//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)
)
);
De nouvelles colonnes sont créées avec le nom correct mais cette formule :

Solution
Il existe deux stratégies générales pour résoudre ce problème : construire l'expression tout en en évaluant une partie avant le reste, et construire l'expression sous forme de chaîne, puis l'évaluer. Notez que la variable insérée peut en réalité être une expression de n’importe quelle longueur.
Expressions
Ces méthodes consistent à écrire une expression et à en évaluer une partie avant le reste. Il peut être difficile de trouver la bonne combinaison d'Eval, Eval Expr et Expr, mais vous pouvez voir la coloration syntaxique et utiliser l'éditeur de script pour vous assurer que les parenthèses correspondent.
Éval, Éval Expr
Écrivez l'expression et enveloppez toutes les parties qui doivent être évaluées immédiatement avec Expr() :
//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)
)
) )
);
Remplaçant
Écrivez l'expression et remplacez-en une partie par du code évalué :
//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] )
) )
);
Méthodes de chaîne
Ces méthodes impliquent d'écrire l'expression sous forme de chaîne, d'utiliser Parse() pour la convertir en expression, puis d'Eval() pour l'évaluer réellement. Les inconvénients de ces méthodes incluent l'absence de coloration syntaxique, la nécessité de gérer les guillemets doubles en utilisant soit \!" ou \[ ... ]\, et le fait qu'elles soient généralement difficiles à dépanner ou à modifier à l'avenir, en particulier pour les expressions longues.
Insertion d'évaluation
Écrivez l'expression sous forme de chaîne avec un code « en ligne » qui est évalué et placé à l'intérieur de la chaîne, puis analysez-la et évaluez-la :
//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)
)]\"
) ) );
);
Remplaçant
Écrivez l'expression dans une chaîne avec un espace réservé qui est remplacé par l'expression évaluée. Notez qu'il s'agit de la même fonction que ci-dessus :
//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] )
) ) );
);
Enchaîner
La forme la plus basique, écrivez l'expression en utilisant '||'.Notez que vous pouvez utiliser use \[ ... ]\ au lieu de \!" :
//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)
)"
) );
);
Voir également
La section « Fonctions de gestion des expressions » du Guide de script inclut ces méthodes et d'autres pour accomplir la même chose.Ce billet de blog par @Joseph Morgan contient des exemples supplémentaires et des informations sur le même sujet.
Merci @Justin_Chilton pour vos commentaires sur ce post.
Insérez des variables ou des expressions dans d'autres expressions.Ceci est une brève introduction à Eval(), Eval Expr(), Substitute(), Parse() et Eval Insert().
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteVoici un exemple de méthode d'expression et de méthode de chaîne :
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] )
) ) );
);
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteCela peut contenir des fonctions inutiles, mais vous pouvez utiliser Name Expr avec une référence de colonne (As Column(name)) :
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))))
);
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteExiste-t-il un moyen où As Column() n'est pas nécessaire ?
Ici, nous devons l'inclure lorsque nous passons une chaîne, je me demande comment faire pour que la formule reste avec :column.
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteMerci beaucoup! Oui. Vous avez raison avec le début de boucle. Je ne m'en étais pas rendu compte.
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute@Jeunot ,
La boucle for commence par i=2, c'est pourquoi elle a ignoré la première colonne et une seule colonne vide appelée Colonne 1 a été créée lors de la création de la table de données. Vous pouvez « réparer » ce problème en démarrant la boucle avec i=1 et en supprimant la colonne 1 après, comme ceci :
Voir plus... Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitutesalut, hein,
cela a fonctionné pour les colonnes b et c. "a" n'apparaît pas. Une colonne 1 vide apparaît à la place.
C'est pourquoi j'ai essayé de mettre la "boucle for" à l'intérieur de la New Table (). Mais avec cette approche, j’obtiens uniquement l’expression à l’intérieur de la formule.
Savez-vous comment gérer la "boucle for" avec une formule à l'intérieur de New Table() afin d'obtenir toutes les colonnes requises à la fois ?
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteSalut @Jeunot ,
Vous devez dire à JMP d'évaluer cette expression avant de la mettre dans la formule, car une fois dans une formule de colonne, il ne sait plus comment référencer votre autre table. En utilisant ma méthode préférée (celle du haut ci-dessus), cela pourrait ressembler à ceci :
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] ) ) )//
)
) )
);
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteCréation d'un tableau avec une formule dans les colonnes - Random Normal() - à partir d'un jmp externe
J'ai déjà une solution efficace à mon problème. Lien ci-dessus.
Cependant, je suis obsédé par le bon fonctionnement de mon code.
Et ce fil semble répondre à mon sujet.
J'ai essayé certaines des techniques ci-dessus. Mais ça ne marche pas ou je ne comprends pas.
Avez-vous une suggestion à me faire ? Comment obtenir l'expression " Comme colonne (mydt, :Mean)[1] " résolu à sourcer les valeurs ?
//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;
;*/
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteTrès utile!
Re : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et SubstituteExcellente revue des méthodes disponibles pour construire dynamiquement des expressions JSL.Maîtrisez cela et tout est assez simple.