반복문 내에서 전역 변수가 덮어쓰기됨안녕하세요,
저는 루프를 돌면서 각 열을 따라 창을 생성합니다. 예를 들어, 아래 JSL 예제에서는 각 열(나이, 몸무게)마다 분포 정보가 담긴 창과 창을 일시적으로 숨기는 버튼을 생성합니다. 문제는 루프가 진행됨에 따라 객체 변수가 이전 창의 값으로 덮어쓰여진다는 것입니다.
예를 들어, 예시에서 생성된 나이 창에서 버튼을 클릭하면 나이 창이 일시적으로 숨겨져야 하지만, 실제로는 체중 창이 덮어쓰기되어 숨겨집니다.
각 창마다 변수 이름을 바꾸지 않고도 각 창마다 독립적인 공간을 가질 수 있도록, 기본값을 여기에 설정하는 등의 방법이 있을까요? 창이 너무 많아서요...
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
lstCols = {"age", "weight"};
For Each( {value, index}, lstCols,
colref = Column( value );
window = New Window( "Window - " || value,
V List Box(
distribution = dt << Distribution( Column( colref ) ),
Button Box( "Hide",
window << show window( 0 );
Wait( 2 );
window << show window( 1 );
)
);
);
);
자동화 및 스크립팅제목: 반복문 내에서 전역 변수가 덮어쓰기되는 문제윈도우 스코프를 사용할 수 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
nws = {};
For Each({value, index}, lstCols,
colref = Column(value);
nw = New Window("Window - " || value,
V List Box(
window:dist = dt << Distribution(Column(colref)),
Button Box("Hide",
window:dist << show window(0);
Wait(2);
window:dist << show window(1);
)
);
);
Insert Into(nws, nw);
);
For Each({nw}, nws,
Show(nw:dist << Get Window Title)
);
버튼 스크립트/함수에 대한 참조를 평가하거나, 스코프를 고려하기 위해 버튼 내부에 약간 더 복잡한 함수를 사용하는 방법도 있습니다.
제목: 반복문 내에서 전역 변수가 덮어쓰기되는 문제아래 해결책은 @jthi 님의 답변만큼 세련되지는 않지만, 제 관점에서는 더 직관적입니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
lstCols = {"age", "weight"};
windows = Associative Array();
For Each( {value, index}, lstCols,
colref = Column( value );
Eval(EvalExpr(
windows[value] = New Window( "Window - " || value,
V List Box(
distribution = dt << Distribution( Column( colref ) ),
Button Box( "Hide",
windows[Expr(value)] << show window( 0 );
Wait( 2 );
windows[Expr(value)] << show window( 1 );
)
);
);
));
);
연관 배열 "windows"는 다양한 창에 대한 참조를 유지하는 컨테이너를 제공하며, "Eval(EvalExpr(...))"는 특정 버튼의 스크립트가 현재 "값"이 아닌 생성 당시의 범위에 있던 "값"을 평가하도록 하는 데 사용됩니다.
제목: 반복문 내에서 전역 변수가 덮어쓰기되는 문제+1. 창 범위에 대한 설명은 다음 링크를 참조하세요: https://www.jmp.com/support/help/en/19.1/?os=mac&source=application#page/jmp/scoped-names.shtml
제목: 반복문 내에서 전역 변수가 덮어쓰기되는 문제안녕하세요, 감사합니다! 덕분에 문제가 해결됐습니다.
제목: 반복문 내에서 전역 변수가 덮어쓰기되는 문제안녕하세요, 답변 감사합니다. 또 다른 방법이군요!
제목: 반복문 내에서 전역 변수가 덮어쓰기되는 문제또한 << 함수 설정>을 사용하고 버튼 참조를 "시작" 지점으로 사용할 수도 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
For Each({colname}, lstCols,
nw = New Window("Window - " || colname,
V List Box(
dt << Distribution(Column(Eval(colname))),
Button Box("Hide", << Set Function(Function({this},
dist_ob = this << prev sib;
show(dist_ob[OutlineBox(2)] << get title);
)));
);
);
);
Write();
and in this case for hiding the window you could just use this << Show Window(0);</CODE></EM></P>
<P>컨텍스트 상자도 때때로 사용될 수 있습니다.</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
For Each({colname}, lstCols,
nw = New Window("Window - " || colname,
V List Box(
Context Box(
box:dist = dt << Distribution(Column(Eval(colname))),
Button Box("Hide",
show(Report(box:dist)[OutlineBox(2)] << get title)
);
)
);
);
);
Write();
저는 상황에 따라 이러한 모든 방법(및 표현식 평가)을 사용합니다.