循环中全局变量被覆盖你好,
我使用循环逐列创建窗口。例如,在下面的 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();
我会根据具体情况使用所有这些方法(以及表达式求值)。