Bonjour,
J'ai essayé de créer de nouvelles colonnes dans une boucle avec quelques variables dans la formule. Les variables sont des noms de colonne que j'essaie de soustraire. J'ai lu des discussions similaires avec des personnes ayant un problème similaire, mais aucune de ces solutions n'a fonctionné dans mon cas. Un extrait de ma boucle:
for (i=1, i<=n, i++,
S="Mean("||vars[i]||")";
S2="Wafer Mean("||vars[i]||")";
ddt << Update(
With(wt),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval(cats) = Eval(cats)
),
Add Columns from Update table(
wt:S2;
)
);
ddt << New Column("Delta from wafer mean("||vars[i]||")", numeric, continuous, formula(ddt:S-ddt:S2));
ddt << Run formulas;
);
Le problème est que JMP le lit littéralement et met S dans la formule plutôt que dans la chaîne. J'ai essayé diverses commandes eval, evalexpr, expr, substitute mais aucune n'a produit les résultats requis.
D'autres suggestions?
Merci
salut @ jjswan33 ,
Bienvenue dans la communauté!
Les solutions que vous avez examinées sont toutes appropriées pour ce que vous voulez faire, mais vous avez quelques problèmes dans votre script:
1. Vous n'avez pas besoin de définir la référence de colonne à la table "ddt" dans la formule, car elle implique que les colonnes référencées dans la formule se trouvent dans la même table que la colonne elle-même. Mettre "ddt" dedans va coder cela dans la formule de colonne, ce qui signifie que la formule ne fonctionnera pas une fois que ddt n’est plus défini.
2 Vous devez insérer les noms de colonne dans ": Name ()", car le nom de la colonne contient des caractères spéciaux, notamment les parenthèses. Par exemple, vous pouvez faire référence à une colonne "Var1" en tant que: Var1, mais vous ne pouvez pas vous référer à une colonne "Moyenne (Var1)" en tant que: Moyenne (Var1); vous devez utiliser: Nom ("Moyenne (Var1)").
Maintenant, je suis partial pour Eval (Parse (Eval Insert ())) parce que je pense que c'est assez facile à comprendre. Commençons par la partie la plus interne, Eval Insert, puis poursuivons notre chemin vers l’extérieur.
- Eval Insert () - utilisez-le pour évaluer les variables d'une chaîne. À l'intérieur de la chaîne, mettez des caractères "^" autour des variables que vous souhaitez évaluer dans la chaîne. Par exemple:
age = 30;
Eval Insert("She is ^age^ years old");
//Returns "She is 30 years old"Si vous devez utiliser des guillemets dans la chaîne (ce que vous faites réellement dans votre cas), il peut être utile de commencer la chaîne par "\ [" et se terminer par "] \". Cela vous permet d'utiliser des guillemets doubles librement dans la chaîne. Vous pouvez également utiliser la syntaxe d'échappement pour ajouter des guillemets (c.-à-d. \! ") À l'intérieur de la chaîne. Voici une chaîne qui devrait fonctionner pour vous:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\"; - Parse () - convertit la chaîne en une expression.
- Eval () - évalue l'expression que vous avez analysée à partir de la chaîne.
Pour tout mettre ensemble, faites quelque chose comme ceci:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\";
For( i = 1, i <= n, i++,
S = "Mean(" || vars[i] || ")";
S2 = "Wafer Mean(" || vars[i] || ")";
ddt << Update(
With( wt ),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval( cats ) = Eval( cats )
),
Add Columns from Update table( wt:S2 )
);
Eval(Parse(Eval Insert( str )));
ddt << Run formulas;
);Notez que j'aurais pu ignorer la définition de chaîne en dehors de la boucle et simplement coincé la chaîne directement dans Eval Insert dans la boucle. Cependant, je pense que cela rend votre code un peu plus facile à déboguer. Si vous obtenez des erreurs, avec cela, regardez Parse (Eval Insert (str)) et voyez si l'expression semble juste.
Espérons que cela aide!