안녕하세요 여러분,
하나의 Expr1()에서 정상적으로 평가되는 변수가 첫 번째 Expr을 호출하는 다른 Expr2()에서 올바르게 평가되지 않는 데 어려움을 겪고 있습니다. 관심 있는 열의 분포를 생성하는 Expr1()을 정의한 코드가 있습니다. 나중에 Expr1()을 다시 호출하는 Expr2()라는 또 다른 표현식이 있습니다. Expr2()에서 제대로 평가되지 않는 것처럼 보이는 변수가 Expr1()에 있습니다.
시각적 개체의 경우 Expr2()는 다음과 같은 창을 생성합니다.

첫 번째 표현식인 Expr1()은 그래프 빌더 아래에 포함된 배포 플랫폼을 생성합니다. 분포 아래의 콤보 상자와 버튼 상자를 사용하면 사용자가 다양한 R^2, RMSE, 평균 절대 편차, -Logliklihood 등과 같은 다양한 맞춤 통계 간에 전환할 수 있습니다. 이에 따라 GB와 분포를 모두 업데이트하려는 의도입니다. GB는 적절하게 업데이트되지만 배포판은 그렇지 않습니다. 예를 들어 Fit Statistic을 RMSE로 변경하면 결과는 다음과 같습니다.

분포 그래프를 업데이트하지만 Expr1() 내에서 설정한 크기 설정이 아닌 기본 크기 설정을 사용합니다. 분포 그래프의 크기가 첫 번째 이미지와 같은 경우 다음과 같이 보일 것입니다.

배포판이 생성되는 Expr1()의 코드 섹션은 다음과 같습니다.
//this part gets column names to insert into Dispatch() below<BR />sfitcol1 = Column( NNYCol + NNcolshift ) << Get Name;
sfitcol2 = Column( NNYCol + 1 + NNcolshift ) << Get Name;
sfitcol3 = Column( NNYCol + 2 + NNcolshift ) << Get Name;<BR /><BR />//in this example, the results are:<BR />//"RMSE Training"<BR />//"RMSE Validation"<BR />//"RMSE Test"
<BR />//this part generates the Distributions that will be used to change my output report in Expr2()
dt_results << Distribution(
Continuous Distribution( Column( Eval( NNYCol + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 1 + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 2 + NNcolshift ) ), Quantiles( 0 ) ),
SendToReport(
Dispatch( {sfitcol1}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol1}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} )
)
);Expr1()을 자체적으로 실행하면 잘 작동합니다. 문제는 Expr2()가 Expr1()을 호출할 때 Dispatch에서 sfitcol# 변수를 평가하지 않기 때문에 실패하므로 FrameBox 크기가 변경되지 않는다는 것입니다. 코드에서 예상되는대로.
배포판을 교체하는 Expr2()의 코드 섹션(콤보 상자만 사용)은 다음과 같습니다.
NNycb = Combo Box(
NNylist,
<<SET></SET>
콤보 상자 함수에 Expr1() 부분을 넣고 sfitcol 변수를 실행한 후 프레임 상자를 수정하기 위해 보고서로 보내면 포함된 로그에 다음 오류가 발생합니다.
개요 컨텍스트 {sfitcol1}에서 "sfitcol1" 항목을 찾을 수 없습니다.
개요 컨텍스트 {sfitcol1}에서 "sfitcol1" 항목을 찾을 수 없습니다.
개요 컨텍스트 {sfitcol2}에서 "sfitcol2" 항목을 찾을 수 없습니다.
개요 컨텍스트 {sfitcol2}에서 "sfitcol2" 항목을 찾을 수 없습니다.
개요 컨텍스트 {sfitcol3}에서 "sfitcol3" 항목을 찾을 수 없습니다.
개요 컨텍스트 {sfitcol3}에서 "sfitcol3" 항목을 찾을 수 없습니다.
예를 들어 첫 번째 Dispatch: Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)})를 사용하여 열 이름을 수동으로 입력하면 변경됩니다. 그에 따라 프레임 상자.

따라서 가능하며 Expr1()에서 항목을 정의한 방법을 통해 작업해야 하지만 Expr2()에서 항목을 실행할 때 변수의 값(텍스트)이 아닌 변수가 전달됩니다. 이 문제를 해결하는 방법에 대한 몇 가지 제안을 받기를 바랍니다. Eval(Substitute(Expr())) 유형 솔루션을 사용할 필요는 없다고 생각하지만 아마도 그렇게 할 것입니다.
어떤 생각/아이디어/제안이라도 주시면 감사하겠습니다.
감사해요!,
DS
배포판을 생성할 때 프레임 크기 설정을 피하고 배포판이 생성된 후에 변경하겠습니다. 특정 프레임박스를 특정 크기로 설정하는 경우 XPath를 사용하여 참조를 가져온 다음 크기를 변경하는 것은 매우 쉽습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Continuous Distribution(Column(:height), Quantiles(0)),
Continuous Distribution(Column(:weight), Quantiles(0))
);
wait(1); // demo purposes
rep = Report(dist);
(rep << XPath("//FrameBox[@helpKey='Distrib Histogram']")) << Frame Size(60, 100);
(rep << XPath("//FrameBox[@helpKey='Distrib Outlier Box']")) << Frame Size(30, 100);
wait(0);
dist << get xml;
귀하가 직면한 문제와 관련하여 확실하게 테스트 스크립트를 작성해야 하지만, 거기에서 해당 값을 평가해야 한다고 생각합니다.
안녕 @jthi ,
내 문제에 대한 빠른 응답과 해결책에 다시 한번 감사드립니다. XPath 명령은 정말 훌륭합니다. 간단한 스크립팅 색인 항목만 읽어도 XPath와 이를 활용하는 방법에 대해 더 자세히 읽어야 한다는 점을 알 수 있습니다. 참고로, 이 문제가 Scripter's Club에서 아직 논의된 적이 있나요? 그렇지 않다면 좋은 주제가 될 수 있습니다.
어쨌든, 제가 처한 상황에 더 가깝게 코드를 수정했는데 잘 작동합니다. Expr2가 Expr1을 호출하고 Expr2 내부에서 분산 프레임 크기가 변경된 아래 수정된 버전을 참조하세요.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Expr1 = Expr(
dist = dt << Distribution(
Continuous Distribution( Column( :height ), Quantiles( 0 ) ),
Continuous Distribution( Column( :weight ), Quantiles( 0 ) )
)
);
Expr2 = Expr(
Nwin = New Window( "Dists", Outline Box( "Results", Expr1 ) );
Wait( 1 ); // demo purposes
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
);
Expr2;
이를 모르는 사람을 위해 알아두어야 할 한 가지는 New Window() 개체 내에서 코드의 XPath 부분을 가질 수 없다는 것입니다.
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
코드의 해당 부분은 새 창 외부에 있어야 합니다. 내 특별한 경우에는 콤보 상자나 이전/다음 버튼을 누를 때 함수의 일부로 포함해야 한다는 것을 알았습니다. 그렇지 않으면 분포의 크기가 원래 크기로 조정됩니다. 예를 들어 콤보 상자 옵션의 경우 다음과 같습니다.
NNycb = Combo Box(
NNylist,
<<SET></SET>
처음 창에 추가할 때 배포판의 크기가 기본값으로 조정되는 짧은 순간이 있지만 그 다음에는 매우 빠르게 올바르게 크기가 조정됩니다.
도움을 주셔서 다시 한 번 감사드리며, JMP 토론 포럼에서 새로운 것을 배우는 것에 항상 감사드립니다.
감사해요!,
DS
세션 7(보고서 계층)에서 XPath를 아주 짧게 다루었다고 생각합니다. 그러나 보고서 계층에 액세스하고 탐색하는 것은 다른 더 긴 세션에서는 좋은 주제라고 생각합니다. Xpath는 기본적으로 자체 언어이며 JSL에서 다른 프로그래밍 언어로 직접 변환하는 기술 중 하나입니다(정규식은 다른 예입니다). XPath 튜토리얼(w3schools.com) . << XPath를 사용하여 JMP에서 보고서 계층에 액세스하면 쉽게 얻을 수 있습니다. 목록 참고할 수 있고 목록에 메시지를 보낼 수 있어 매우 유용합니다. << Get XML을 << XPath와 결합하면 다양한 표시 상자에 대한 강력한 "경로"(기본적으로 참조 가져오기)를 구축할 수 있습니다.