En résolvant Créer de manière itérative des colonnes contenant des formules, j’ai rencontré le besoin de structurer la solution d’une manière dont je ne comprends pas pourquoi. Ma solution initiale était
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNames = dt << get column names( continuous, string );
For Each( {col}, colNames,
theTarget = (Column( Eval( col ) ) << get property( "Spec Limits" ))["Target"];
Eval(
Eval Expr(
New Column( col || " Minus Target",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( As Column( Eval( col ) ) - Expr( theTarget ) )
)
)
);
);
Et ça échoue pour
Column NPN1 Minus Target Formula Interrupted
Name Unresolved: col at row 1 in access or evaluation of 'col' , col/*###*/
Formula evaluation errors have been ignored
Column NPN1 Minus Target Formula Interrupted
Name Unresolved: col at row 1001 in access or evaluation of 'col' , col/*###*/
Formula evaluation errors have been ignored
Alors qu'en forçant une affectation de la variable col Le code fonctionnera
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNames = dt << get column names( continuous, string )<BR /><BR />For Each( {xcol}, colNames,
col = xcol;
theTarget = (Column( Eval( col ) ) << get property( "Spec Limits" ))["Target"];
Eval(
Eval Expr(
New Column( col || " Minus Target",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( As Column( Eval( col ) ) - Expr( theTarget ) )
)
)
);
);
De plus, une fois que j'ai exécuté le code avec
col = xcol;
Je peux exécuter le code sans l'affectation xcol et le code d'origine fonctionnera.
C'est déroutant pour moi. Quelqu'un peut-il expliquer le raisonnement derrière cela ?
Il est fort probable que quelqu'un de JMP doive fournir la bonne réponse. @EvanMcCorkle ?
Je ne suis pas sûr de la raison exacte, mais l'une des raisons est que la colonne ne sera pas évaluée dans la formule ( changez Eval() en Expr() pour forcer le nom de la colonne à l'intérieur de As Column()) (Ou je pense que vous pouvez exécutez << exécutez les formules après la création de la formule, puis supprimez immédiatement la formule pour vous assurer qu'elle ne sera pas réévaluée avec une colonne incorrecte).
Si col est la variable que vous stockez pour chaque valeur de conteneur, elle n'existera pas en dehors de la boucle avec ces valeurs (définir xcol sur col contourne quelque peu cela)
Names Default To Here(1);
a = {"a", "b", "c"};
b = "z";
show(b);
For Each({b}, a,
show(b);
);
show(b);
/*
b = "z";
b = "a";
b = "b";
b = "c";
b = "z";
*/
Je préfère utiliser cette méthode (Expr(NameExpr(AsColumn())) car cela laisse la formule "plus propre" (:name au lieu de AsColumn("name").
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/semiconductor capability.jmp");
colNames = (dt << get column names(continuous, string))[1::10];
For Each({col}, colNames,
theTarget = (Column(Eval(col)) << get property("Spec Limits"))["Target"];
Eval(
Eval Expr(
New Column(col || " Minus Target",
Numeric,
"Continuous",
Format("Best", 10),
Formula(Expr(NameExpr(As Column(col))) - Expr(theTarget))
)
)
);
);
Ce n'est probablement pas les mêmes problèmes que... Chaque boucle a une portée locale de fonction (c'est extrêmement ennuyeux... Chaque boucle ne se comporte pas correctement avec la portée locale de la fonction. J'ai signalé cela au support JMP)
Names Default To Here(1);
b = 2;
my_f = function({a}, {Default Local},
c = Transform Each({item}, a,
a * b
);
return(c);
);
my_f2 = function({a}, {Default Local},
b = b; // "Fix"
c = Transform Each({item}, a,
a * b
);
return(c);
);
Try(
show(my_f({1,2,3}));
,
show(exception_msg);
);
Try(
show(my_f2({1,2,3}));
,
show(exception_msg);
);