Comment utiliser les valeurs de colonne comme entrée pour une formule dans un script ?Tous,
Je pense que ma question est très basique mais je n'ai pas encore trouvé de réponse.
J'ai un tableau de données comme indiqué ci-dessous

Je souhaite
a) inclure 3 nouvelles colonnes intitulées %CFB colonne 3, %CFB colonne 4 et %CFB colonne 5. %CFB signifie % de changement par rapport à la ligne de base.
b) Dans chaque nouvelle colonne, je souhaite saisir le pourcentage de changement par rapport à la ligne de base avec les valeurs dérivées de la formule suivante
%CFB = (x - Colonne 3)/Colonne 3, où "x" sera remplacé par les valeurs de la colonne 3, 4 ou 5 à chaque itération codée ci-dessous.La colonne 3 est la valeur de référence
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
New column ("%CFB " || data_col) << Formula((( :data_col - :column 3) / :column 3) * 100 ));
En utilisant le script ci-dessus, j'ai pu créer les nouvelles colonnes mais aucun résultat de la formule n'y est placé.Quand j'échange manuellement colonne 3 pour données_col dans la formule, toutes les nouvelles colonnes sont évaluées à zéro, comme je m'y attendais.Cela me dit que la formule est au moins correcte et que la variable data_col n'est pas interprétée/substituée comme je le souhaiterais.Toute idée pour faire fonctionner cela serait appréciée.
Merci d'avance pour votre aide
Floyd Fox
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je ne sais pas dans quelle mesure les opinions sont les bienvenues, mais voilà.
Personnellement, je suis un énorme adversaire d'Eval(Parse()), simplement parce que cela réduit considérablement la lisibilité dans l'éditeur.J'ai vu 5 000 scripts de lignes qui sont, pour la plupart, entièrement roses (ou quelle que soit la couleur que vous choisissez pour vos chaînes).Avec la possibilité de remplacer des expressions, vous conservez la coloration syntaxique intacte et je pense qu'il est simplement beaucoup plus facile de modifier le script d'autres personnes.
J'utilise encore très occasionnellement eval(parse()), j'essaie d'utiliser JSL quote() mais quand je le dois.
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?Excellente note sur la gestion de la portée ici WK Emballer le tout ensemble pour floydfoxfb avec un peu de formatage du code.
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
new_col_name = "%CFB " || data_col;
Eval(
Eval Expr(
dt << New Column( Expr(new_col_name),
Numeric,
Continuous,
Formula( ((Column( dt, Expr( data_col ) )[] - :column 3) / :column 3) * 100 )
)
)
);
);
Une autre solution de contournement à la portée des variables consisterait à utiliser Définir chaque valeur (équation) au lieu de Formule (équation).Cela présente l'avantage d'utiliser moins de ressources puisqu'une formule n'est pas calculée, mais cela présente l'inconvénient d'une perte dans la modification de ladite formule.
Comme pour toute bonne chose, il existe de nombreuses façons d’aborder un problème en utilisant les bons outils.Comme vous l'avez mentionné, Substitute() est également une excellente option lorsque les choses commencent à progresser.Substitute est particulièrement utile en combinaison avec Parse() qui transforme les chaînes en code JSL et Eval() qui permet ensuite d'exécuter le JSL, cela conduit aux instructions Eval(Parse(Substitute())).Cette dernière technique est particulièrement utile lors du regroupement de fonctionnalités autour de plates-formes JMP intégrées.Pour illustrer davantage la combinaison de parse() et eval(parse), j'ai inclus un exemple simple.

Bon codage !
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?Bonjour,
Avec cet exemple, la variable data_col apparaît toujours dans la formule.Puisque vous attribuez data_col dans une boucle For, toute tentative d'évaluation des formules une fois la boucle terminée produira les mêmes valeurs dans les trois nouvelles colonnes.En effet, data_col représentera la dernière valeur de la boucle For, "Colonne 5".Supposons également que vous enregistriez la table, puis fermez JMP.Lorsque vous ouvrez à nouveau la table dans une nouvelle instance de JMP et tentez d'évaluer la formule, une erreur apparaît car JMP ne sait plus ce que data_col doit représenter.
Lorsque vous utilisez une variable dans une formule, vous devrez faire quelque chose pour demander à JMP de remplacer la variable par sa valeur avant d'évaluer la formule.Vous pouvez utiliser Substitute(), mais je trouve que la méthode Eval Expr() (comme vince.faller0 mentionné) est plus facile à mettre en œuvre pour la plupart des gens.Eval Expr() indique à JMP d'évaluer (remplacer) toutes les variables encapsulées dans une fonction Expr() dans l'expression que vous fournissez comme argument. Un Eval() externe amènera JMP à évaluer l'intégralité de l'instruction New Column une fois le remplacement effectué.Remarque sur l'utilisation de JMP 41824 démontre également ce concept.
J'espère que ça aide.
Wendy
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?Vince,
Merci pour ça.Franchement, je devrai lire un peu l'expression que vous avez fournie, mais j'apprécie votre compréhension des raisons pour lesquelles mon code n'a pas fonctionné.
Salutations
Floyd
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?Nat,
Merci, ce code fonctionne et présente l'avantage supplémentaire que je peux comprendre la logique derrière le code.
Floyd
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?vince.faller0 a en effet identifié avec précision la racine du problème.Il n'y a pas de colonne nommée data_col dans la table de données.Par conséquent, le code tel qu'écrit fait référence à quelque chose qui n'existe pas.En outre, Vince montre certaines des manières puissantes d'utiliser JSL pour écrire le code destiné à contenir des références dynamiques.Cela dit, dans tout bon langage, vous disposerez de plusieurs options pour exécuter la logique.
Je suggère d'utiliser un autre format de référencement de la colonne.Alors que le format simple consiste à utiliser le point-virgule et le nom de la colonne pour référencer les colonnes actuelles de la table de données, un moyen plus puissant consiste à utiliser le format colonne (référence de la table de données, chaîne de colonne ou nombre).Ci-dessous, j'ai légèrement modifié votre code pour utiliser ce format.
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
col_name = "%CFB " || data_col;
dt << New Column(col_name,
Numeric,
Continuous,
Formula( ((column(dt, data_col)[] - :column 3) / :column 3) * 100 ) );
);
Re : Comment utiliser les valeurs de colonnes comme entrée pour une formule dans un script ?Vous ne pouvez pas faire :variable (en particulier avec une chaîne, ce que <
Si vous le changez en
data_col = Column( i ) ;
Eval(EvalExpr(New column ("%CFB " || Expr(data_col<<GET name=""></GET>
ça devrait marcher.
Il remplace simplement toutes les Expr() à l'intérieur d'EvalExpr() par leurs valeurs réelles au lieu de variables.