ループ内で上書きされるグローバル変数こんにちは、
列ごとにループ処理を行い、ウィンドウを作成しています。例えば、以下の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 );
)
);
);
);
自動化とスクリプトRe: ループ内で上書きされるグローバル変数ウィンドウスコープを使用できる
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)
);
ボタンのスクリプト/関数への参照を評価したり、スコープを考慮するためにボタン内で少し複雑な関数を使用したりすることもできます。
Re: ループ内で上書きされるグローバル変数以下は、 @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(...))」は、特定のボタンのスクリプトが現在の「値」ではなく、作成時のスコープ内の値を評価し続けていることを確認するために使用されます。
Re: ループ内で上書きされるグローバル変数+1. ウィンドウスコープについては、こちらで説明されています: https://www.jmp.com/support/help/en/19.1/?os=mac&source=application#page/jmp/scoped-names.shtml
Re: ループ内で上書きされるグローバル変数こんにちは、ありがとうございます!問題は解決しました
Re: ループ内で上書きされるグローバル変数こんにちは。ご回答ありがとうございます。別の方法ですね!
Re: ループ内で上書きされるグローバル変数<<関数の設定を使用して、ボタンの参照を「開始」点として使用することもできます。
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();
状況に応じて、これらすべての方法 (および式の評価) を使用します。