expr()을 사용하여 수식에서 변수 열 이름 바꾸기중첩 루프를 만들려고 합니다.
첫 번째 루프는 일부 열을 생성하고 수식을 갖습니다.
두 번째 루프는 다른 열을 생성하고 수식에는 첫 번째 루프의 열이 필요합니다.
내 질문은 두 번째 루프에 있습니다. eval() + substitue() + expr()을 사용하여 수식에서 열 이름을 올바르게 설정할 수 없습니다.
Names Default To Here( 1 );
dt = current data table();
a=3;
b=3;
alist = {1,2,3};
blist = {1,2,3};
// In actual script, above numbers will come from H list box input
For (i=1, i <= a, i++,
dt << New Column( eval("a_" || char(alist[i])), Formula(:gap*2) );
col = "a_" || char(alist[i]);
For (k=1, k <= b, k++,
eval(
substitute(
Expr(
dt << New Column( eval("a_" || char(alist[i]) || " b_" || char(blist[k])), Formula( If(:vvv > 0 & (:vvv < blist[k] ),1,0) ) );
),
Expr(vvv),
col //here gives wrong result, the formula doesn't really use column a_1, a_2, a_3, instead it use "a_1"......etc
)
)
)
)
자동화 및 스크립팅Re: expr()을 사용하여 수식에서 변수 열 이름을 바꾸세요.이것은 약간의 아이디어를 줄 수 있습니다
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
a = 3;
b = 3;
alist = {1, 2, 3};
blist = {1, 2, 3};
// In actual script, above numbers will come from H list box input
For(i = 1, i <= a, i++,
new_col = dt << New Column(Eval("a_" || Char(alist[i])), Formula(:height* 2));
For(k = 1, k <= b, k++,
Eval(Substitute(
Expr(dt << New Column("a_" || char(new_col << get name) || " b_" || char(blist[k]),
Formula(If(vvv > 0 & (vvv < www), 1, 0))
)),
Expr(vvv), Name Expr(AsColumn(new_col)),
Expr(www), blist[k]
)
)
);
);
편집하다:
JMP16+가 있는 경우 루프를 For Each로 변경할 수 있습니다(이것은 또한 Eval(Substitute()) 대신 Eval(EvalExpr())을 사용합니다. 제 생각에는 다음과 같은 간단한 경우에 더 명확합니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
alist = {1, 2, 3};
blist = {1, 2, 3};
For Each({aval}, alist,
new_col = dt << New Column("a_" || Char(aval), Formula(:height * 2));
For Each({bval}, blist,
col_title = "a_" || Char(new_col << get name) || " b_" || Char(bval);
Eval(EvalExpr(
dt << New Column(col_title, Numeric, Nominal, Formula(
If(0 < Expr(Name Expr(As Column(dt, new_col))) < Expr(bval),
1
,
0
)
))
));
);
);
Re: expr()을 사용하여 수식에서 변수 열 이름을 바꾸세요.이것으로 내 질문이 해결되었습니다. 감사합니다. 두 번째 방법이 훨씬 더 명확해 보입니다.
한 가지 더 질문이 있습니다. 저는 제 코드에서 blist[k]를 직접 사용하고 "www"를 사용한 다음 이를 바꿉니다. 둘 다 동일한 계산 결과를 제공합니다.
코드가 실행된 후 사용자가 수식을 다시 적용하려고 하면 잘못될 수 있는 변수 blist[k]가 수식에 남아 있기 때문입니까?
Re: expr()을 사용하여 수식에서 변수 열 이름을 바꾸세요.짧은 답변:
예. blist 또는 k에 대한 참조를 잃으면 수식을 다시 평가할 수 없습니다. 두 가지 모두에 계속 액세스할 수 있는 동안 수식을 다시 평가하면 같은 k는 잘못된 답을 산출하는 모든 수식에 사용됩니다. 다음을 실행하여 이를 테스트할 수 있어야 합니다. dt << 수식을 다시 실행합니다.
더보기...
긴 답변:
예, 평가하지 않으면 데이터 테이블에 blist[k]가 남게 됩니다. 그러면 이는 모든 수식에 있는 마지막 k 값이 됩니다(blist 및 k에 액세스할 수 있는 동안 수식을 다시 평가하는 경우 문제 발생). 그리고 테이블이 다시 열리는 경우(또는 어떤 이유로 blist/k에 대한 액세스 권한을 상실한 경우) 그런 것들은 전혀 존재하지 않을 거예요. 이러한 유형의 사례는 일반적으로 공식을 확인하여 쉽게 확인할 수 있습니다.


이런 일이 쉽게 발생할 수 있는 다른 곳은 그래픽 스크립트이며 그래픽 스크립트 창에서도 비슷하게 볼 수 있습니다.</CODE></P>
<P> </P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
line = 60;
framebox = Report(gb)[frame box(1)];
framebox << Add Graphics Script(
H Line(line)
);
line = 70;
framebox << Add Graphics Script(
H Line(line)
);
다음과 같은 두 개의 스크립트가 있습니다.

Y = 60에는 선이 없습니다. 또한 그래프 빌더 스크립트를 복사하면 값 대신 줄이 표시됩니다.
Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11))),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Add Graphics Script(9, Description(""), H Line(line)),
Add Graphics Script(10, Description(""), H Line(line))}
)
)
)
이를 쉽게 해결할 수 있는 방법은 값을 평가하는 것입니다.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
line = 60;
framebox = Report(gb)[frame box(1)];
Eval(EvalExpr(
framebox << Add Graphics Script(
H Line(Expr(line))
);
));
line = 70;
Eval(EvalExpr(
framebox << Add Graphics Script(
H Line(Expr(line))
);
));
보다 일반적으로 말하면, 변수 이름을 값으로 평가하여 대체하기 시작하면 때로는 모든 변수를 평가하는 것이 좋은 생각일 수 있습니다. 이 경우 내가 의미하는 바는 열 제목도 평가하는 것이 도움이 될 수 있다는 것입니다.
Eval(EvalExpr(
dt << New Column(Expr(col_title), Numeric, Nominal, Formula(
If(0 < Expr(Name Expr(As Column(dt, new_col))) < Expr(bval),
1
,
0
)
))
));
);
예를 들어 코드를 디버깅할 때 추가적인 이점이 있습니다. 다음은 참조에서 열을 생성하고 잘 작동하는 변수를 사용하는 간단한 예입니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
new_col = dt << New Column("Test", Numeric, Continuous, << Set Each Value(1));
col_title = (new_col << get name) || "* var";
var = 2;
Eval(EvalExpr(
dt << New Column(col_title, Numeric, Nominal, Formula(
Expr(NameExpr(AsColumn(dt, new_col))) * Expr(var)
));
));
하지만 문제가 있는 경우 EvalExpr()과 그 안에 있는 모든 항목을 강조 표시하고 스크립트의 해당 부분을 실행할 수 있습니다.

col_title은 평가되지 않습니다(이 경우에는 문제가 아니지만 더 복잡한 스크립트가 있는 경우 문제가 될 수 있음). (이 경우) Expr()을 하나 더 추가하면 실제로 무슨 일이 일어나고 있는지 더 많은 정보를 얻을 수 있습니다.

Re: expr()을 사용하여 수식에서 변수 열 이름을 바꾸세요.자세한 정보를 제공해 주셔서 감사합니다. 귀하의 요점을 이해합니다. 귀하의 예에 따라 내 코드를 수정하겠습니다.