appeler une colonne en se référant à une variableUn débutant complet ici,
n'a pas pu trouver la solution dans les messages plus anciens,
J'ai créé une variable contenant un nom de colonne existant. Je veux créer une nouvelle colonne, où les données de deux autres colonnes sont additionnées (en appelant les colonnes par des variables). l'utilisation de la variable est destinée à une utilisation ultérieure dans une boucle for.
Merci pour ton aide!
pour le code ci-dessous :
dt = Current Data Table();
columnname1 = Column( dt, 1 ) << Get Name;
columnname2 = Column( dt, 2 ) << Get Name;
dt << New Column( "new_" || columnname1, Numeric , continuous, formula(column(dt, columnname1)+column(dt, columnname2)));
J'obtiens l'erreur suivante :
Colonne nouvelle_Colonne 1 2 Formule Interrompue
Impossible de convertir l'argument en nombre [ou matrice] 1 fois Aux lignes : 2 Opération : Add, Column( dt, columnname1 ) + /*###*/Column( dt, columnname2 ) /*###*/
Les erreurs d'évaluation de la formule ont été ignorées
Column( "new_Column 1 2" )
Modélisation statistique avancéeAccès aux donnéesFusion et nettoyage des donnéesExploration et visualisation des donnéesRe : appeler une colonne en se référant à une variable@txnelson a tout à fait raison à ce sujet.La méthode que j'ai suggérée était une option paresseuse et, rétrospectivement, ce n'est pas une approche que je recommanderais.Si vous voulez juste une colonne avec des valeurs correctes, vous pouvez faire un calcul en boucle et ne pas vous soucier d'une formule ; si la formule est importante pour vous, vous devez vérifier que votre script a correctement encodé la formule - il ne suffit pas que les chiffres apparaissent corrects.Les variables de script ne persisteront pas au-delà de la durée de vie du script, la formule doit donc inclure correctement les références de colonne - ceci est réalisé en utilisant des techniques de substitution d'expression telles que celle illustrée par Jim.
Re : appeler une colonne en se référant à une variableMerci pour votre réponse rapide. Ça marche!
Re : appeler une colonne en se référant à une variableVous pouvez le faire fonctionner, avec
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnname1 = Column( dt, 4 ) << Get Name;
columnname2 = Column( dt, 5 ) << Get Name;
dt << New Column( "new_" || columnname1,
Numeric,
continuous,
formula(
As Column( dt, columnname1 ) + As Column( dt, columnname2 )
)
);
Cependant, il y a un problème potentiel avec cela.La formule stockée est :

Cette formule continuera de fonctionner tant que votre session JMP
- Les variables, dt, columnname1 et columnname2 sont définies.Que se passe-t-il si vous enregistrez la table de données, arrêtez JMP, puis demain, vous démarrez JMP et ouvrez la table de données.La formule ne trouvera pas ces variables et la formule échouera.
- Au sein de la session, les variables dt, nomcolonne1 et nomcolonne2 ne changent pas de valeur.Ainsi, si vous créez cette colonne, et plus tard dans votre script, vous changez la valeur de la variable nomcolonne1, puisque les colonnes de formule dans une table de données JMP sont dynamiques, la formule sera réexécutée lorsque des modifications seront apportées à la table de données, JMP utilisera la nouvelle valeur de la variable et créera de nouvelles valeurs pour la colonne de formule.
Ce que vous devez vraiment faire, c'est utiliser une méthode qui crée la syntaxe JSL réelle pour la formule.Dans l'exemple ci-dessus, ce que vous voulez vraiment, c'est que la formule soit
:height + :weight
Le JSL ci-dessous est une façon de le faire.Il utilise la fonction Substitute() pour implanter les noms de colonnes réels dans la formule.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnname1 = Column( dt, 4 ) << Get Name;
columnname2 = Column( dt, 5 ) << Get Name;
Eval(
Substitute(
Expr(
dt << New Column( "new_" || columnname1,
Numeric,
continuous,
formula( __c1__ + __c2__ )
)
),
Expr( __c1__ ), Parse( ":" || columnname1 ),
Expr( __c2__ ), Parse( ":" || columnname2 )
)
);Re : appeler une colonne en se référant à une variableVous avez déjà créé des variables qui font référence aux colonnes.Vous pouvez les utiliser dans votre formule, mais vous devez utiliser la fonction AsColumn :
formula( AsColumn(columnname1) + AsColumn(columnname2) )
Re : appeler une colonne en faisant référence à une variableJuste pour les futurs lecteurs de cette question :
J'ai utilisé le code ci-dessus pour transmettre les noms de colonnes de chaînes aux formules, mais j'ai eu des problèmes avec l'utilisation de
Parse(":" || column_name)Parse est vulnérable aux noms de colonnes impairs puisque les noms de colonnes comme "a - b" seraient interprétés comme la colonne "a" moins la variable "b".
Utilisez plutôt
As Name(columnname)
qui résout ce problème.