comment passer une colonne en paramètre dans une formuleSalut,
J'essaie de créer une formule simple sur des colonnes stockées sous forme de variables dans une liste.
Je ne comprends pas pourquoi JSL refuse d'exécuter la formule.
Si je change dans la formule le paramètre par la chaîne qu'il stocke, cela fonctionne parfaitement.
De l'aide ??
Voici le code que j'utilise :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
for(j=1, j <= N items(MyList), j++,
dt << New Column( ParamPlot[j], Formula( 2* ParamPlot[j]) );
);
J'ai essayé des choses comme Eval, Eval expr,... mais pas du tout 
Re : comment passer une colonne en paramètre dans une formuleCourt et efficace 
Merci beaucoup 
Re : comment passer une colonne en paramètre dans une formuleJe n'ai pas pu résister à une dernière prise. Court et doux et ça marche. Utiliser evalinsert évaluer des variables, :nom() faire référence à des colonnes, "\[ ]\" pour autoriser les guillemets doubles à l'intérieur d'une chaîne, et enfin utiliser eval(parser()) pour exécuter la chaîne résultante.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
new_col_expr = evalinsert("\[dt << New Column("^paramplot[j]^", Formula(2 * :name("^mylist[j]^")))]\");
eval(parse(new_col_expr));
);Re : comment passer une colonne en paramètre dans une formuleTout d'abord merci à tous pour vos réponses...
Voici mon avis sur toutes les solutions proposées :
1/ La solution proposée par Mark : Fonctionne parfaitement (bien que difficile à lire lorsqu'on n'est pas habitué à Eval, parse, Substitue,...).
2/ La solution proposée par Jan : Effectivement, mieux dans les yeux (utilise aussi eval, replacementinto,...). D'ailleurs ça marche parfaitement.
3/ La Solution de Byron : Utilise aussi Eval, substitut, expr...Fonctionne parfaitement
4/ La solution de pmroz est de loin la plus simple (aux yeux), mais la formule que nous obtenons est toujours référencée à MyList et non aux colonnes qu'ils doivent représenter...Ce qui signifie que si je change une valeur dans la colonne "age " , la colonne "age2" ne sera pas mise à jour.
Merci à tous pour les suggestions 
Re : comment passer une colonne en paramètre dans une formuleComme Byron l'a dit, vous essayez de créer une nouvelle colonne qui est 2 fois elle-même. Je pense que c'est ce que tu veux. AS COLUMN a fait l'affaire.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
dt << New Column( ParamPlot[j], Formula( 2 * as column(dt, MyList[j]) ) )
);
Cela fonctionne très bien tant que vous n'ajoutez pas de lignes. Ensuite, vous aurez besoin des evals, exprs etc.
Re : comment passer une colonne en paramètre dans une formuleon dirait que vous essayez de créer une formule qui se multiplie par 2. cela ne fonctionnera pas et devrait renvoyer une valeur vide.
De plus, "j" est une fonction permettant de créer des matrices (notez qu'elle devient bleue dans l'éditeur JSL). J'évite donc généralement d'utiliser "j" comme variable au cas où elle pourrait être interprétée de manière inattendue.
Travailler avec des noms de colonnes et des références peut être assez frustrant. Jetez un oeil à cette stratégie.
À l'intérieur de la boucle, la colonne est d'abord créée et, lors de sa création, elle reçoit un handle "newcol" à utiliser comme référence. Ensuite, il y a la grande clause eval(substitute)). Dans cet argument, la "col<
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( i = 1, i <= N Items( MyList ), i++,
newcol=dt << New Column( ParamPlot[i] );
Eval(
Substitute(
Expr(
newcol << set formula( a * 2 ) ) ,
Expr( a ), As Name( mylist[i] )
);
));Re : comment passer une colonne en paramètre dans une formulePeut-être que c'est un peu mieux (aux yeux de certains):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
CMD = Expr(dt << New Column( NameTBD, Formula( 2 * colTBD) ));
SubstituteInto(CMD, Expr(NameTBD), ParamPlot[j], Expr(ColTBD), Parse(":"||MyList[j]));
CMD;
);
Re : comment passer une colonne en paramètre dans une formuleLe problème est que l'argument de Formula() est traité comme une expression littérale. Il n'évalue pas ParamPlot[j] et remplace le résultat pour créer la formule souhaitée. Il semble que vous devriez être capable d'utiliser des expressions, mais je n'ai aucune idée avec cette approche, alors voici une solution basée sur des chaînes de caractères à la place :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
Eval(
Parse(
Substitute("dt << New Column( \!"nnn\!", Formula( 2 * :ppp ) )",
"nnn",
ParamPlot[j],
"ppp",
MyList[j]
)
);
);
);
Je n'aime vraiment pas utiliser des chaînes de caractères, mais parfois, vous devez faire ce que vous devez faire.