Utiliser la variable de colonne dans l'expression IFChère Communauté,
Ci-dessous, j'utilise plusieurs variables apportées par un Dialog :
- colSelect : la colonne à analyser
- quantVal1 & quantVal2 : valeurs quantiles
Dans le script suivant, je crée une colonne "Catégories", qui sera ensuite tabulée pour obtenir des montants pour chaque quantile.
Deux problèmes :
- le remplacement du nom de colonne codé en dur par une méthode Eval() ne fonctionne pas
- comment tester si la colonne existe déjà, et si oui, mettre à jour sa formule ?
Cela permettrait de rafraîchir tout mon processus d'analyse avec de nouvelles colonnes et quantiles, sans avoir à recommencer à zéro le chargement et le traitement de la table de données.
//Custom Quantiles amounts
dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal1,
1,
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
);Merci!
ScriptRe : Utiliser la variable de colonne dans l'expression IFUn léger inconvénient de ce code : les variables de la formule ne seront plus définies ultérieurement.
Cela peut être vu par les tremblements rouges dans l'éditeur de formule :

Le résultat : lorsqu'une valeur de la table change à l'avenir, la colonne ne sera pas mise à jour automatiquement.
Un code plus robuste peut être généré avec une approche que j'ai apprise de @jthi :
Mettre NomExpr(Comme Colonne()) à l'intérieur Expr() .
Ensuite, la formule ressemblera à ceci :

et les valeurs de colonne seront mises à jour à l'avenir si les valeurs d'entrée sont mises à jour 
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect ="age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( NameExpr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( Name Expr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
dt:age[12]=40;
Re : Utiliser la variable de colonne dans l'expression IFMerci encore Byron,
Après avoir essayé les deux et lu certains des liens fournis, c'est finalement un mélange des deux qui a fonctionné : AsColumn()
Merci a tous!
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( AsColumn( colSelect )/*:age*/ <= quantVal1,
1,
If( AsColumn( colSelect )/*:age*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return indexRe : Utiliser la variable de colonne dans l'expression IFpeut-être aussi regarder ces deux arguments aussi:
Colonne()
Comme nom()
votre script essaie peut-être d'analyser ColSelect comme une chaîne de texte plutôt que comme un nom de colonne
Re : Utiliser la variable de colonne dans l'expression IFMerci beaucoup Jarmo,
J'ai des solutions partielles dans votre réponse.
Pourtant, l'astuce colSelect ne fonctionne qu'avec une valeur numérique donnée, pas un nom de colonne (oublié de mentionner)
Grâce à votre exemple, voici plus à quoi cela ressemblerait (Expr (colSelect) ne fonctionne pas dans ce contexte mis à jour):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( /*Expr( colSelect )*/:age <= quantVal1,
1,
If( /*Expr( colSelect )*/:age <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index
Re : Utiliser la variable de colonne dans l'expression IFSalut Byron,
Le Show(colSelect) renvoie une chaîne simple, pas une liste (j'ai pris soin de cela lors du passage des arguments Dialog):
colSelect = "Temps total entre l'enregistrement et la sortie" ;
Je vais explorer ce PDF, merciRe : Utiliser la variable de colonne dans l'expression IFpuisque ColSelect provient d'une boîte de dialogue, il peut en fait s'agir d'une liste d'un élément.
Si vous évaluez ColSelect, qu'est-ce qui est renvoyé ? si c'est {:colname}, alors c'est une liste d'un élément
Essayez d'évaluer ColSelect[1], s'il provient d'une liste, alors :colname sera renvoyé.
Dans ce cas, eval() renvoie la liste.
jetez un oeil à Eval list() aussi
il y a un pdf qui est SUPER utile pour comprendre les expressions attachées à ce post.
Fonctions de gestion des expressions : Partie I - Démêler Expr(), NameExpr(), Eval(), ... Énigme
Re : Utiliser la variable de colonne dans l'expression IF1. Bon fil comment remplacer les valeurs dans la formule :
Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute
Si vous n'avez pas besoin de formule, je suggérerais d'utiliser <
2. Vous pouvez obtenir la liste des noms de colonnes avec dt << Get Column Names ("String") et utiliser Contient() pour vérifier les colonnes de cette liste
Cela devrait fonctionner :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = 1;
quantVal1 = 1;
quantVal2 = 2;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index