열을 함수의 인수로 전달하는 방법새 열을 만들고 수식을 설정하는 함수를 만들려고 합니다.
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",
"?"
)
)
)
)
);
);
하지만 생성된 수식을 보면 뒤에 있는 문자열이 아닌 col1을 전달합니다.
다음과 같이 함수를 호출합니다.
my_function("새 열", Column("column_1"), Column("column_2"));
자동화 및 스크립팅Re: 함수의 인수로 열을 전달하는 방법이를 처리하는 한 가지 방법이 있습니다.

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: 함수의 인수로 열을 전달하는 방법열을 참조하기 위해 문자열("age") 대신 열(일명 :age)을 사용하려는 경우 해결해야 할 두 가지 문제가 있습니다.
- 수동으로 생성된 함수는 인수를 평가합니다.
따라서 열을 함수 인수로 사용하면 Jmp는 이를 평가합니다(즉, 현재 행의 값을 반환합니다 *).
→ 이를 방지하려면:
Name Expr() 로 열을 래핑합니다.
- 대부분의 경우 Jmp는 변수(예: "col1")를 해당 값(해당 열)으로 바꾸지 않습니다.
예를 들어 새 열() 또는 << 수식 설정
→ Jmp가 그렇게 하도록 강제하려면:
나머지 부분을 평가하기 전에 Eval(Eval Expr( .... Expr( xyz ) ... ) 을 사용하여 xyz를 평가합니다.
2b) Jmp가 열 참조(*와 같은)를 과대평가하는 것을 방지하려면 Name Expr()을 다시 사용하십시오 .
따라서 조합하여 사용하십시오.
Expr(이름 Expr(colX))
... 컬럼을 사용하고 싶은 곳 어디든
전체적으로:
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: 열을 함수의 인수로 전달하는 방법정말 감사합니다. 정확히 제가 필요했던 것입니다. 또한 elseif가 훨씬 좋습니다! 공유해주셔서 감사합니다
Re: 함수의 인수로 열을 전달하는 방법저는 항상 이름(및 테이블 참조)이 포함된 열을 전달합니다. 수식이 필요한 경우 Eval Insert, Eval Expr, Parse 및 Substitute 메서드를 사용하여 하나의 표현식을 다른 표현식에 삽입하여 빌드합니다(저는 Eval(EvalExpr())를 선호하지만 귀하의 경우에는 Eval(Substitute())를 사용합니다. 여기서는 이 문제를 처리할 수 있는 방법 중 하나입니다
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에는 elseif를 사용할 수 있는 옵션이 있으며(작성되지는 않았지만) 여러 if 문을 중첩하는 경우 대신 작동할 수도 있습니다.
더보기...
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");