JSL : Création d'une formule à l'aide d'un nom de colonne variableSalut,
Je veux faire une chose en fait simple (du moins je le pensais), à savoir créer une nouvelle colonne en utilisant JSL avec une formule contenant un nom de colonne variable. J'ai déjà essayé plusieurs combinaisons de commandes "colonne, comme colonne, nom, comme nom, eval, parse .." et j'ai cherché sur le forum, mais tout ce que j'ai essayé aboutit à une erreur indiquant que la formule n'a pas pu être évaluée.
Un exemple de ce que je veux faire:
"colonne 1" est une colonne de ma table de données.
a = "column 1";
new column("test", formula(a*2));
La colonne "test" doit contenir la formule qui multiplie la "colonne 1" par 2.
Merci pour toute aide,
Dahla
Re: JSL : Création d'une formule à l'aide d'un nom de colonne variableAprès avoir essayé de trouver une solution efficace, j'ai finalement abandonné et demandé au support JMP comment procéder. Wendy m'a gentiment montré les lignes clés et je les ai intégrées dans une boucle for en guise de démo. Le code que j'inclus suppose que la table de données actuelle comporte 2 colonnes nommées abc et def qui contiennent quelques lignes de données de votre choix. À propos, il existe un nouveau livre de SAS Press intitulé Jump into JMP Scripting par Wendy Murphrey et Rosemary Lucas, qui est un livre très utile sur les scripts. Il couvre Expr et Eval Expr utilisés dans l'exemple.
dt = Current Data Table();
cols = {abc, def};
nlist = N Items(cols);
For( i = 1, i <= nlist, i++,
newColExpr = Expr(
dt << New Column( char(cols[i])||"*2", Numeric, Formula( Expr( cols[i] ) * 2 ) )
);
Eval( Eval Expr( newColExpr ) );
)Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableParfois, les choses les plus simples peuvent être déroutantes en JSL 
Voici quelques approches :
new column("test",formula( as column("column 1")*2 ));
ou
a = "column 1";
new column("test",formula( a[]*2 ));
La logique de la syntaxe est la suivante : dans le premier exemple, nous souhaitons traiter la « colonne 1 » comme une colonne de nombres. Dans le deuxième exemple, « [] » indique que a est un tableau de nombres.
J'espère que cela aide
Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableMerci pour la réponse, mais malheureusement cela n'aide pas.
La première approche n'est pas ce que je voulais car je dois extraire le nom de la colonne d'une variable (il peut changer).
La deuxième approche ne fonctionne pas, car JMP n'insère pas le nom réel de la colonne dans la formule. Si vous ouvrez la boîte de dialogue de modification de la formule, vous verrez « a[Empty()] * 2 » dans votre suggestion, alors que j'aurais besoin d'un élément comme « :Column1 * 2 ».
D'autres suggestions ?Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableJe pense que mon deuxième exemple aurait dû se lire comme ceci :
a = Column("column 1");
new column("test",formula( a[]*2 ));
Re : JSL : Création d'une formule à l'aide d'un nom de colonne variable@mpb : Ça marche bien ! Merci de l'avoir découvert et pour l'astuce du livre !Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableMerci, ça marche !Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableJ'ai encore une question supplémentaire :
Finalement, je souhaite créer une nouvelle colonne pour chaque élément d'une liste. Dans la solution de Stig, la formule de la colonne dépend toujours de la variable « a[] » et non (comme je le préférerais) du nom de la colonne « Colonne 1 ». Je ne peux donc pas modifier « a[] » dans le script suivant sans modifier également les valeurs calculées des colonnes. Cela signifie que mon approche ne fonctionne pas (la longueur de la liste et les noms des colonnes peuvent changer, j'ai donc besoin d'une boucle) :
collist = {"column 1", "column 2"};
for (k=1, k<=length(collist), k++,
a = Column(collist);
new column(concat("test",char(k)), formula( a[]*2 ));
);
L'insertion directe d'un élément de liste dans l'instruction formula() ne fonctionne pas non plus. Quelqu'un aurait-il une autre suggestion ?
Dahla
Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableSi j'utilise le code suivant :
dt = Current Data Table();
a = Column("height");
dt << New Column("test1",formula(a[]*2));
a = Column("weight");
dt << New Column("test2",formula(a[]*2));
Les deux colonnes test1 et test2 sont calculées correctement, même si leur formule fait référence à la même variable a. En principe, le code utilisé dans une boucle ne devrait donc pas poser de problème. Cependant, cette approche ne fonctionne pas si vous souhaitez que les nouvelles colonnes conservent leur comportement dans la table en tant que colonnes calculées. La question de la génération d'une colonne avec la formule « :colonne 1 * 2 » à partir du code reste donc ouverte.
Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableOh, je vois seulement maintenant que mon message précédent n'était pas entièrement affiché... Désolé pour ça.
Oui, j'ai besoin que les colonnes conservent leur comportement, ou du moins leurs valeurs. C'est pourquoi j'ai eu l'idée de supprimer les formules directement après les avoir calculées. Mais je n'ai pas trouvé d'instruction similaire à « Formule… -> Effacer », c'est-à-dire supprimer la formule et conserver les valeurs. Quelqu'un sait-il comment cela fonctionne ?
Ce ne serait pas la solution la plus agréable, mais cela me suffit pour le moment.Re : JSL : Création d'une formule à l'aide d'un nom de colonne variableJ'ai maintenant trouvé une solution de contournement pour lire les valeurs de la colonne dans un vecteur et écrire les valeurs calculées dans une nouvelle colonne.
Mais je suis toujours intéressé par les réponses aux questions ouvertes.
Dahla