So übergeben Sie Spalten als Argumente für eine FunktionIch versuche, eine Funktion zu erstellen, die eine neue Spalte erstellt und eine Formel festlegt:
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",
"?"
)
)
)
)
);
);
Wenn ich mir aber die erstellte Formel anschaue, übergibt sie col1 und nicht den String dahinter.
Aufruf der Funktion wie folgt:
my_function("Neue Spalte", Spalte("Spalte_1"), Spalte("Spalte_2"));
Automatisierung und SkriptingBetreff: So übergeben Sie Spalten als Argumente für eine FunktionHier ist eine Möglichkeit, damit umzugehen

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" );Betreff: So übergeben Sie Spalten als Argumente für eine FunktionWenn Sie zum Verweisen auf die Spalten lieber die Spalte (auch bekannt als :age) anstelle von Zeichenfolgen ("age") verwenden möchten, müssen zwei Probleme gelöst werden:
- eine manuell generierte Funktion wertet ihre Argumente aus.
Wenn Sie also eine Spalte als Funktionsargument verwenden, wird Jmp sie auswerten (d. h. den Wert der aktuellen Zeile zurückgeben *).
→ um es zu verhindern:
Umschließen Sie die Spalte mit Name Expr()
- In den meisten Fällen ersetzt Jmp Variablen (wie "col1") nicht durch ihren Wert (die jeweilige Spalte),
zB in new column() oder << set formula
→ um Jmp dazu zu zwingen:
Verwenden Sie Eval(Eval Expr( .... Expr( xyz ) ... ), um xyz auszuwerten, bevor Sie den verbleibenden Teil auswerten.
2b) Um zu verhindern, dass Jmp die Spaltenreferenz überbewertet (wie in *), verwenden Sie erneut Name Expr() .
Verwenden Sie daher in Kombination
Ausdruck(Name Ausdruck(SpalteX))
... wo auch immer Sie die Säule einsetzen möchten
in Summe:
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
Betreff: So übergeben Sie Spalten als Argumente für eine FunktionVielen Dank, genau das, was ich brauchte. Auch das elseif ist so viel besser! Danke fürs Teilen
Betreff: So übergeben Sie Spalten als Argumente für eine FunktionIch übergebe immer Spalten mit Namen (und Tabellenverweisen). Und wenn Sie eine Formel benötigen, verwenden Sie „Einfügen eines Ausdrucks in einen anderen“ und verwenden Sie die Methoden „Eval Insert“, „Eval Expr“, „Parse“ und „Substitute“, um ihn zu erstellen (ich bevorzuge „Eval(EvalExpr()), aber in Ihrem Fall würde ich „Eval(Substitute())“ verwenden). Hier ist eine Option, wie Sie damit umgehen könnten
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");
Außerdem bietet JMP die Möglichkeit, elseif zu verwenden (obwohl dies nicht geschrieben ist), und dies könnte in Ihrem Fall stattdessen funktionieren, wenn mehrere if-Anweisungen verschachtelt sind
Mehr sehen...
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");