Come passare le colonne come argomenti per una funzioneSto cercando di creare una funzione che crei una nuova colonna e imposti una formula:
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",
"?"
)
)
)
)
);
);
Ma quando guardo la formula creata, passa su col1 anziché sulla stringa dietro di essa.
Chiamando la funzione come:
mia_funzione("Nuova colonna", Colonna("colonna_1"), Colonna("colonna_2"));
Automazione e scriptingRi: Come passare le colonne come argomenti per una funzioneEcco un modo per gestire questa situazione

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" );Ri: Come passare le colonne come argomenti per una funzioneSe preferisci utilizzare la colonna (aka :age) invece di Strings ("age") per fare riferimento alle colonne, ci sono 2 problemi da risolvere:
- una funzione generata manualmente valuta i suoi argomenti.
Quindi se usi una colonna come argomento di una funzione, Jmp la valuterà (cioè restituirà il valore della riga corrente *)
→ per prevenirlo:
avvolgi la colonna con Name Expr()
- Nella maggior parte dei casi Jmp non sostituisce le variabili (come "col1") con il loro valore (la rispettiva colonna),
ad esempio in nuova colonna() o << imposta formula
→ per forzare Jmp a farlo:
utilizzare Eval(Eval Expr( .... Expr( xyz ) ... ) per valutare xyz prima di valutare la parte rimanente.
2b) per evitare che Jmp sopravvaluti il riferimento alla colonna (come in *), usa di nuovo Name Expr() ,
quindi, in combinazione , utilizzare
Espr(Nome Espr(colX))
... ovunque tu voglia utilizzare la colonnina
in totale:
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
Ri: Come passare le colonne come argomenti per una funzioneGrazie mille, proprio quello di cui avevo bisogno. Anche l'elseif è molto meglio! Grazie per la condivisione
Ri: Come passare le colonne come argomenti per una funzionePasso sempre nelle colonne con i nomi (e il riferimento alla tabella). E se hai bisogno di una formula usa Inserisci un'espressione in un'altra usando i metodi Eval Insert, Eval Expr, Parse e Substitute per costruirla (preferisco Eval(EvalExpr()) ma nel tuo caso userei Eval(Substitute()). è un'opzione su come potresti gestire questa situazione
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");
Inoltre JMP ha la possibilità di utilizzare elseif (anche se non è scritto) e potrebbe funzionare nel tuo caso se si annidano più istruzioni if
Visualizza altro...
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");