수식 열을 동적으로 만들려고 할 때 문제가 발생했습니다. 결국 해결했지만 여기서 무슨 일이 일어나고 있는지 알고 싶습니다. 내 생각 엔 수식을 작성하는 방법과 관련이 있고 "수식"이 열로 설정되기 전에 평가 된 다음 어떻게 든 열 수식을 엉망으로 만든다는 것입니다.
다음은 예입니다. 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에 노출되지 않습니다.