수식 열을 동적으로 만들려고 할 때 문제가 발생했습니다. 나는 결국 그것을 해결할 수 있었지만 여기서 무슨 일이 일어나고 있는지 알고 싶습니다. 내 생각에 그것은 내가 수식을 작성하는 방법과 관련이 있으며 "수식"이 열로 설정되기 전에 평가되고 어떻게 든 열 수식을 엉망으로 만듭니다.
예를 들면 다음과 같습니다. test1 및 test2에 의해 생성된 열에는 문제가 있고 test3은 잘 작동합니다(test4 및 test5도 잘 작동하는 것 같습니다. 문자열에서 열 참조로 변환됨)
Names Default To Here(1);
test1 = function({dt, val_col, by_cols}, {Default Local},
ref_list = Transform Each({col_name}, Insert(by_cols, val_col, 1),
Name Expr(As Column(dt, col_name));
);
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Substitute(ref_list, Expr(list), Expr(Col Median))
));
return(new_col);
);
test2 = function({dt, val_col, by_cols}, {Default Local},
ref_list = Transform Each({col_name}, Insert(by_cols, val_col, 1),
Name Expr(As Column(dt, col_name));
);
new_formula = Substitute(ref_list, Expr(list), Expr(Col Median));
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Name Expr(new_formula)
));
return(new_col);
);
test3 = function({dt, val_col, by_cols}, {Default Local},
ref_list = Transform Each({col_name}, Insert(by_cols, val_col, 1),
Name Expr(As Column(dt, col_name));
);
new_formula = Char(Substitute(ref_list, Expr(list), Expr(Col Median)));
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Parse(new_formula)
));
return(new_col);
);
test4 = function({dt, val_col, by_cols}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(Col Median(_new_formula_))
)),
Expr(_new_formula_), Insert(by_cols, val_col, 1)
));
return(new_col);
);
test5 = function({dt, val_col, by_cols}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column("Formula", Numeric, Continuous,
Formula(_new_formula_)
)),
Expr(_new_formula_), Substitute(Insert(by_cols, val_col, 1), Expr(List), Expr(Col Median))
));
return(new_col);
);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
by_cols = {"age", "sex"};
val_col = "height";
col1 = test1(dt, val_col, by_cols);
col2 = test2(dt, val_col, by_cols);
col3 = test3(dt, val_col, by_cols);
col4 = test3(dt, val_col, by_cols);
col5 = test3(dt, val_col, by_cols);
Show(col1 << get formula);
Show(col2 << get formula);
Show(col3 << get formula);
Show(col4 << get formula);
Show(col5 << get formula);
//dt1 = dt << Subset(All Rows, Selected columns(0), Suppress formula evaluation(0));
//Close(dt, no save);
예를 들어 Formula 2의 수식 편집기를 열고 적용을 누르면 오류가 발생할 수 있습니다.

"깨진" 공식을 복구할 수 있는 방법이 있습니까? 생성하는 동안 공식이 깨질 가능성이 있습니까? Parse(Char())를 사용하여 작업 수식을 얻을 수 있으며 데이터의 하위 집합을 만들 수도 있습니다.
Windows 10에서 JMP Pro 16.2.0으로 테스트했습니다.
노력하다
Expr(Col Median())
추가 ().
파서는 괄호를 보고 다음을 설정합니다. 기능 표현식 트리의 노드에 플래그를 지정합니다. 괄호가 없으면 열 중앙값 node는 사용되지 않을 자식이 있는 이름일 뿐입니다( arg() 및 char() 변환 제외). 런타임에 이름은 변수의 이름 공간에 없고 내장 함수의 이름 공간은 사용되지 않으므로 메시지가 표시됩니다.
이 설명은 5가지 테스트 모두의 동작과 일치한다고 생각합니다.
공식 (...)는 ColMedian(...)과 다릅니다. ColMedian은 JSL 함수입니다. 공식 NewColumn 메시지가 인식하는 키워드입니다. 키워드 처리는 자식을 예상하므로 expr(Formula())이 필요하지 않을 수 있지만 아마 잘 작동할 것입니다.
편집: 나는 꽤 확신한다 기능 플래그는 arg() 등을 통해 JSL에서 노출되지 않습니다.