여보세요,
수식에 몇 가지 변수가있는 루프 안에 새로운 열을 만들려고했습니다. 변수는 빼기려고하는 열 이름입니다. 유사한 문제가있는 사람들과 유사한 스레드를 읽었지만 그 해결책 중 어느 것도 내 경우에는 효과가 없습니다. 내 루프 스 니펫 :
for (i=1, i<=n, i++,
S="Mean("||vars[i]||")";
S2="Wafer Mean("||vars[i]||")";
ddt << Update(
With(wt),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval(cats) = Eval(cats)
),
Add Columns from Update table(
wt:S2;
)
);
ddt << New Column("Delta from wafer mean("||vars[i]||")", numeric, continuous, formula(ddt:S-ddt:S2));
ddt << Run formulas;
);
문제는 JMP가 말 그대로 문자를 읽고 문자열 대신 수식에 S를 넣는 것입니다. 나는 다양한 eval, evalexpr, expr, 대체 명령을 시도했지만 아무도 필요한 결과를 산출하지 못했다.
다른 제안?
감사
안녕하세요 @ jjswan33 ,
커뮤니티에 오신 것을 환영합니다!
살펴본 솔루션은 사용자가 원하는 모든 적절한 솔루션이지만 스크립트에 몇 가지 문제가 있습니다.
1. 수식에서 참조하는 열이 열 자체와 동일한 테이블에 있음을 범위에 암시하기 때문에 수식에서 "ddt"테이블에 대한 열 참조 범위를 지정할 필요가 없습니다. "ddt"를 거기에 넣으면 열 수식에 하드 코딩됩니다. 즉, ddt가 더 이상 정의되지 않으면 수식이 작동하지 않습니다.
2. 열 이름에 특수 문자 (특히 괄호)가 있으므로 ": Name ()"에 열 이름을 래핑해야합니다. 예를 들어 "Var1"열을 Var1로 참조 할 수 있지만 "Mean (Var1)"열을 다음과 같이 참조 할 수는 없습니다. Mean (Var1); Name ( "Mean (Var1)")을 사용해야합니다.
이제는 이해하기가 쉽기 때문에 Eval (Parse (Eval Insert ()))의 일부입니다. 가장 안쪽 부분 인 Eval Insert부터 시작하여 바깥쪽으로 나아 갑니 다.
- Eval Insert () - 문자열 내 변수를 평가할 때 사용합니다. 문자열 내에서 문자열 내에서 평가할 변수 주위에 "^"문자를 넣으십시오. 예 :
age = 30;
Eval Insert("She is ^age^ years old");
//Returns "She is 30 years old"문자열 내부에 큰 따옴표를 사용해야한다면 문자열을 "\ ["로 시작하고 "] \"로 시작하는 것이 도움이 될 수 있습니다. 이렇게하면 문자열 안에서 자유롭게 큰 따옴표를 사용할 수 있습니다. 또는 이스케이프 구문을 사용하여 문자열 안에 큰 따옴표 (예 : \! ")를 추가 할 수 있습니다. 여기 당신을 위해 일해야 할 문자열이 있습니다 :
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\"; - Parse () - 문자열을 표현식으로 변환합니다.
- Eval () - 문자열에서 구문 분석 한 표현식을 평가합니다.
모두 정리하려면 다음과 같이하십시오.
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\";
For( i = 1, i <= n, i++,
S = "Mean(" || vars[i] || ")";
S2 = "Wafer Mean(" || vars[i] || ")";
ddt << Update(
With( wt ),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval( cats ) = Eval( cats )
),
Add Columns from Update table( wt:S2 )
);
Eval(Parse(Eval Insert( str )));
ddt << Run formulas;
);참고, 루프 외부에서 정의 문자열을 건너 뛸 수 있었고 루프 내에서 Eval Insert에 문자열을 직접 붙일 수있었습니다. 그러나, 이것은 당신의 코드를 좀 더 쉽게 디버깅 할 수 있다고 생각합니다. 오류가 발생하면 Parse (Eval Insert (str))를 살펴보고 표현식이 올바르게 보이는지 확인하십시오.
잘하면 그게 도움이!