JSL을 사용하여 열 수식을 동적으로 설정I'm working on a JSL script where I need to dynamically build a formula for a given column inside a loop. The idea is to reference a different column for each iteration, so that the formula uses the evaluated column name (e.g., :col_name) rather than inserting the literal code.
루프에서 달성하려는 내용의 간단한 버전은 다음과 같습니다(이 코드에서 Expr, Eval, Parse를 여러 가지 변형하여 시도했지만 아무 소용이 없었습니다):
all_cols = dt << Get Column Names();
col = Column(all_cols[N Items(all_cols)-1]); // Changes for every i in the loop
// Dynamically build the formula expression using column names directly
formula = If(
col > :UL_outliers | col < :LL_outliers,
1,
0
);
outlier_col << Set Formula(formula);The problem is that when I set the formula using Set Formula(), instead of dynamically evaluating the column reference, the formula is inserted literally into the column's formula editor. As a result, the column formula is not evaluated and is simply:
If(
col > :UL_outliers | col < :LL_outliers,
1,
0
);동적으로 생성된 공식이 평가되지 않음 과 다른 관련 게시물을 읽었지만, 제 정신이 녹아내리고 있습니다. 저는 이상치 열에 1이나 0이 몇 개만 있으면 좋겠습니다.
도움이나 해결 방법이 있다면 정말 감사하겠습니다. 미리 감사드립니다!
자동화 및 스크립팅Re: JSL을 사용하여 열 수식을 동적으로 설정당신이 무엇을 하려고 하는지 100% 확신할 수는 없지만 이것이 몇 가지 아이디어를 줄 수 있습니다.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt << new column("LL_outliers", Numeric, Continuous, Set Each Value(50));
dt << new column("UL_outliers", Numeric, Continuous, Set Each Value(70));
all_cols = dt << Get Column Names("Continuous", "String");
colname = all_cols[1];
f_expr = Substitute(
Expr(If(_col_ > :UL_outliers | _col_ < :LL_outliers,
1,
0
)),
Expr(_col_), Name Expr(AsColumn(dt, colname));
);
new_col = dt << New Column("F", Numeric, Nominal);
Eval(EvalExpr(
new_col << Set Formula(Expr(NameExpr(f_expr)));
));Re: JSL을 사용하여 열 수식을 동적으로 설정JMP에는 문자열 데이터 유형이 있습니다.
a = "고양이";
b = "3 + 5";
a와 b는 문자열입니다. B는 표현식처럼 보이지만 표현식이 아닙니다.
c = 파싱(b);
c는 트리로 표시될 수 있는 표현식입니다.
operator(+)
/ \
3 5
c = expr( 3 + 5 ); // 는 c에 저장된 동일한 표현식을 얻는 또 다른 방법입니다.
d = eval( c ); // 또는 그냥 d = c; 오른쪽은 어쨌든 평가됩니다.
d는 8입니다.
때로는 JMP가 c를 8로 자동 평가하고, 때로는 그렇지 않습니다. 때로는 8을 원하고, 때로는 3+5를 원합니다.
e = 이름식(c);
e는 c가 갖는 표현식을 얻습니다. nameexpr을 얇은 래퍼로 생각해 보세요. 래퍼가 평가되면 더 깊은 평가를 차단하고 8이 아닌, 평가되지 않은 3+5 표현식을 반환합니다.
JMP에는 여기서 다루지 않은 표현식 트리를 조작하기 위한 함수 세트도 있습니다. 예를 들어, @jthi는 substitute를 사용했습니다.
당신이 궁금해하는 부분 중 하나는 JSL의 다양한 함수가 표현식 인수를 처리하는 방식의 차이입니다.
대부분의 함수와 마찬가지로 cos(c)는 c를 8까지 평가합니다. 이는 예상한 바입니다.
열이름< 문자 그대로 표현식(c, 3+5가 아니고 8이 아님)을 복사합니다. 8) 평가하지 않고 열 수식에 적용합니다. (<에 대한 경우와 마찬가지로)
따라서 setformula에는 두 가지 특수한 경우가 있습니다.
열이름< c (특별하지 않음)
열이름< 8(평가 래퍼)
열이름< 3+5(nameexpr 래퍼)
이것들은 실제로 특수한 경우입니다. setformula는 JSL이 사용자가 기대하는 대로 동작하도록 하기 위해 eval이나 nameexpr 래퍼를 감지하기 위한 추가적인 노력을 기울입니다.
이제 거의 끝났는데, 이 부분에 3+8 대신 x+y를 사용했으면 좋았을 텐데; 그러면 평가를 나중으로 미루는 이유가 더 명확해질 겁니다. 또한, 8과 같은 단일 숫자도 표현식입니다. eval(8)은 8입니다.
Re: JSL을 사용하여 열 수식을 동적으로 설정정신을 뒤흔들지만 매우 교육적인 설명에 감사드립니다. 적어도 개념적으로는 이해한 것 같습니다.
알아봐야겠어요.
정말 감사합니다 !:)