Comment passer des colonnes comme arguments pour une fonctionJ'essaie de créer une fonction qui crée une nouvelle colonne et définit une formule :
my_function = Function( {name, col1, col2},
dt << New Column( name, Character);
Column(dt,name) << Set Formula(
If(
:col1 == "Positive" & :col2 ==
"TRUE",
"True Positive",
If(
:col1 == "Negative" & :col2== "TRUE",
"False Positive",
If(
:col1 == "Negative" & :col2 == "FALSE",
"True Negative",
If(
:col1 == "Positive" & :col2 == "FALSE",
"False Negative",
"?"
)
)
)
)
);
);
Mais quand je regarde la formule créée, elle transmet col1 plutôt que la chaîne derrière.
Appeler la fonction comme :
ma_fonction("Nouvelle colonne", Colonne("colonne_1"), Colonne("colonne_2"));
Automatisation et scriptsRe : Comment passer des colonnes en arguments pour une fonctionVoici une façon de gérer cela

Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 5 ),
New Column( "a",
Character,
"Nominal",
Set Values( {"Positive", "Positive", "Negative", "Negative", "unknown"} )
),
New Column( "b",
Character,
"Nominal",
Set Values( {"TRUE", "FALSE", "TRUE", "FALSE", ""} )
)
);
my_function = Function( {name, col1, col2},
dt << New Column( name, Character );
Eval(
Eval Expr(
Column( dt, name ) << Set Formula(
If(
as Column( Expr( col1 ) ) == "Positive" & as Column( Expr( col2 ) )
== "TRUE", "True Positive",
as Column( Expr( col1 ) ) == "Negative" & as Column( Expr( col2 ) )
== "TRUE", "False Positive",
as Column( Expr( col1 ) ) == "Negative" & as Column( Expr( col2 ) )
== "FALSE", "True Negative",
as Column( Expr( col1 ) ) == "Positive" & as Column( Expr( col2 ) )
== "FALSE", "False Negative",
"?"
)
)
)
);
);
my_function( "new column", "a", "b" );Re : Comment passer des colonnes en arguments pour une fonctionSi vous préférez utiliser une colonne (aka :age) au lieu de Strings ("age") pour référencer les colonnes, il y a 2 problèmes à résoudre :
- une fonction générée manuellement évalue ses arguments.
Donc si vous utilisez une colonne comme argument de fonction, Jmp l'évaluera (c'est-à-dire retournera la valeur de la ligne actuelle *)
→ pour l'empêcher :
enveloppez la colonne avec Name Expr()
- Dans la plupart des cas, Jmp ne remplace pas les variables (comme "col1") par leur valeur (la colonne respective),
par exemple dans une nouvelle colonne() ou << définir la formule
→ pour forcer Jmp à le faire :
utilisez Eval(Eval Expr( .... Expr( xyz ) ... ) pour évaluer xyz avant d'évaluer la partie restante.
2b) pour empêcher Jmp de surévaluer la référence de colonne (comme dans *), utilisez à nouveau Name Expr() ,
donc, en combinaison , utilisez
Expr(Nom Expr(colX))
... partout où vous souhaitez utiliser la colonne
au total:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_function = Function({name, col1, col2},
new_col = Eval(Eval Expr(New Column(name, Character, Formula(Expr(Name Expr(col1)) /* #2b */ - Expr(Name Expr(col2))/* #2b */ )))); // #2
);
col = my_function("diff", Name Expr(:height), Name Expr(:weight)); //#1
Re : Comment passer des colonnes en arguments pour une fonctionMerci beaucoup, exactement ce dont j'avais besoin. De plus, le elseif est bien meilleur ! Merci d'avoir partagé
Re : Comment passer des colonnes en arguments pour une fonctionJe passe toujours des colonnes avec des noms (et une référence de table). Et si vous avez besoin d'une formule, utilisez Insérez une expression dans une autre en utilisant les méthodes Eval Insert, Eval Expr, Parse et Substitute pour la construire (je préfère Eval(EvalExpr()) mais dans votre cas, j'utiliserais Eval(Substitute()). Ici est une option pour gérer cela
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_function = Function({dt, name, col1, col2},
new_col = Eval(Substitute(
Expr(dt << New Column(name, Character, Formula(
If(_col1_ == "Positive" & _col2_ == "TRUE",
"True Positive",
If(_col1_ == "Negative" & _col2_== "TRUE",
"False Positive",
If(_col1_ == "Negative" & _col2_ == "FALSE",
"True Negative",
If(_col1_== "Positive" & _col2_ == "FALSE",
"False Negative",
"?"
)
)
)
)
))),
Expr(_col1_), Name Expr(AsColumn(dt, col1)),
Expr(_col2_), Name Expr(AsColumn(dt, col2))
));
return(new_col)
);
col = my_function(dt, "test", "name", "sex");
JMP a également la possibilité d'utiliser elseif (même s'il n'est pas écrit) et cela pourrait fonctionner dans votre cas à la place si vous imbriquez plusieurs instructions if.
Voir plus...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_function = Function({dt, name, col1, col2},
new_col = Eval(Substitute(
Expr(dt << New Column(name, Character, Formula(
If(_col1_ == "Positive" & _col2_ == "TRUE",
"True Positive",
_col1_ == "Negative" & _col2_== "TRUE",
"False Positive",
_col1_ == "Negative" & _col2_ == "FALSE",
"True Negative",
_col1_== "Positive" & _col2_ == "FALSE",
"False Negative"
,
"?"
),
))),
Expr(_col1_), Name Expr(AsColumn(dt, col1)),
Expr(_col2_), Name Expr(AsColumn(dt, col2))
));
return(new_col)
);
col = my_function(dt, "test", "name", "sex");