J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Voir plus... For (j=3, j<=10, j=j+2,
ColLen=Length(Char(Column name (j)));
ColName=Left (Char(Column Name(j)),ColLen -5);
NewCol=Substr(ColName,6);
New Column(
"Delta: "||NewCol,
Numeric,
Formula (
(Column (j)- Column(j+1))
)
)
);
Automatisation et scriptRe : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Semble fonctionner "une fois" (les valeurs sont OK) - mais (au moins pour mon cas de test) la variante #1 signale une erreur avec la formule lorsque vous l'ouvrez ensuite :

La variante #6 semble résoudre ce problème :

mais cela échouera définitivement une fois que Jmp sera fermé et oublie quoi dt moyens ....
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Just As Column() au lieu de column a fonctionné !
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Just As Column() au lieu de column a fonctionné !
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Ca ne fonctionne pas 
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Après avoir bidouillé un peu
- esp : se demander pourquoi #1 ne donne pas le résultat attendu :
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length,Sepal width, Petal length};
i = 2;
Eval( Eval Expr( dt << New Column( "new1", Formula( As Column( Expr( i ) ) ) ) ) ); //works but the formula is corrupted
Eval( Eval Expr( dt << New Column( "new2", Formula( As Column( Expr( Column(i) ) ) ) ) ) );
Eval( Eval Expr( dt << New Column( "new3", Formula( As Column( Expr( Char( cols[i] ) ) ) ))) );
Eval(Substitute(Expr(dt << New Column( "new4", Formula( __col__ ) )),Expr(__col__),Name Expr(As Column(i)) ));
Eval(Eval Expr(dt << New Column("new5", Formula(Expr(NameExpr(AsColumn(i)))))));
// new:
Eval( Eval Expr( dt << New Column( "new6", Formula( As Column( dt, Expr( i ) ) ) ) ) ); ... J'ai trouvé une nouvelle variante qui n'a pas besoin de la clôture Nom Expr pour que ça marche *)
Intéressant ...
*) travail - jusqu'à ce que Jmp soit fermé et redémarré
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Un bon article sur ce sujet est Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute . Dans votre cas, vous avez besoin d'une solution un peu plus compliquée car vous utilisez des indices de colonne au lieu de noms de colonne si vous voulez avoir des formules (la plupart du temps, je suggérerais d'utiliser des noms au lieu d'indices). La plupart du temps, j'utilise Eval(EvalInsert()) mais le substitut est également une bonne option
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(3),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3])),
New Column("Column 2", Numeric, "Continuous", Format("Best", 12), Set Values([2, 3, 4])),
New Column("Column 3", Numeric, "Continuous", Format("Best", 12), Set Values([3, 4, 5])),
New Column("Column 4", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6])),
New Column("Column 5", Numeric, "Continuous", Format("Best", 12), Set Values([6, 7, 8]))
);
For(j = 1, j < 5, j = j + 2,
// ColLen = Length(Char(Column Name(j)));
// ColName = Left(Char(Column Name(j)), ColLen - 6);
// NewCol = Substr(ColName, 6);
new_col = Word(2, Column(dt, j) << get name, " ");
Eval(Eval Expr(
New Column("Delta: " || new_col, Numeric, Formula(
Expr(NameExpr(AsColumn(j))) - Expr(NameExpr(AsColumn(j + 1)))
))
));
);
Quelques fonctions/messages supplémentaires qui pourraient vous intéresser : < < Obtenir les noms de colonne , Mot() (recherchez également Words(), Item() et Items() à partir de l'index de script), Pour chaque() (si vous avez JMP16+)
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.@mmarchandTSI , Je suis d'accord,
Formula(Column( ...
ne fonctionnera pas.
Que diriez-vous d'utiliser Substitute :
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(Substitute(Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (__colA__ - __colB__) ) );
),Expr(__colA__),Name Expr(As Column(j)),Expr(__colB__),Name Expr(As Column(j+1)) ))
);
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.C'est parce que Column() est une référence à la colonne elle-même et non aux valeurs de la colonne.Je sais comment faire ce que tu veux d'une manière laide.Le script suivant fonctionnera entre-temps jusqu'à ce que quelqu'un publie une solution plus jolie.
Names Default To Here( 1 );
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(
Parse(
"New Column( \!"Delta: " || NewCol || "\!",
Numeric,
Formula(
:\!"" ||
(Column( j ) << Get Name) || "\!"n - :\!"" || (Column( j + 1 ) << Get Name) || "\!"n
))"
)
);
);
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.JSL utilise une portée dynamique - je crois que vous travaillez sous l'hypothèse implicite de portée lexicale (que la plupart des langages de programmation utilisent).
Étant donné que JSL utilise une portée dynamique, la résolution de portée pour le nom j se fait à Durée , et lorsque la formule calcule le nom j n'est plus dans la portée, donc il se trompe.
Pour contourner ce problème, vous pouvez pré-évaluer des parties du code afin que JMP n'ait pas de variable à rechercher dans la formule de la colonne :
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval( Eval Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (Column( Expr( j ) ) - Column( Expr( j + 1 ) )) ) );
) )
);
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.@CrownofTears , Basé sur votre JSL d'origine :
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(
Eval Expr(
New Column( "Delta: " || NewCol,
Numeric,
Formula( (As Column( Expr( Column Name( j ) ) ) - As Column( Expr( Column Name( j + 1 ) ) )) )
)
)
);
);J'aime les fonctions propres As Column("column name"), et ce n'est pas moche comme ma solution Eval( Parse(...) ).
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.J'aurais dû souligner que pour passer de la référence de colonne à la valeur de ligne, il suffit de mettre un [] .Ce qui suit devrait fonctionner :
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval( Eval Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (Column( Expr( j ) )[] - Column( Expr( j + 1 ) )[]) ) );
) )
);
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.J'aurais dû souligner - pour passer d'une référence de colonne à une valeur de ligne dans une formule, mettez un [] après la référence de colonne
Column( 1)[] + Column( 2 )[]
Re : J'essaie de créer une colonne et de la remplir avec une formule, mais j'obtiens une erreur.Chouette astuce 
Column(1)[]
au lieu de
Column(1)[row()]