你好,
感谢论坛各位用户,我有一个包含列切换器和本地数据过滤器的脚本可以运行。该脚本按预期运行,下一步我想将其打包为客户端的插件。我想我了解插件的工作原理,可以启动脚本,它会完成数据导入、清理和汇总,并生成界面。但是,现在当我尝试执行列切换器时,界面会出错,而如果我单独启动脚本,列切换器就可以正常工作。如果我单击列切换器中的新项目,则会收到以下错误。我已附加代码然后创建此视图。在我的代码中,我将其附加到摘要数据表,然后从脚本内部执行它。如果我通过插件(我刚刚附加脚本的地方)运行,它会出错。如果我关闭该窗口并单击数据表上的按钮,构建相同的显示,它会按预期工作而不会出现错误。所以我有点困惑,不知道我应该改变什么,有什么见解?
安迪

cell_sum << new script(
"Main Interface",
cell_sum = Current Data Table();
test = Fit Group(
Oneway(
Y( :Max Discharge Capacity ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Cycle Number (>0.8)"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Discharge Capacity @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Remain % @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
<<{Arrange in Rows( 4 )}
);
colpick = test << Column Switcher(
:Cathode Recipe.x,
cell_sum << get column names( Ordinal, Nominal )
);
(test << top parent)[listboxbox( 1 )] << set script(
Try( test << remove local data filter );
mycurrent = ((test << top parent)[listboxbox( 1 )] << get selected)[1];
test << Local Data Filter(
Add Filter( columns( Column( mycurrent ) ), Display( Column( mycurrent ), N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
test << Local Data Filter(
Add Filter( columns( colpick << get current ), Display( colpick << get current, N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
cell_sum << run script( "Main Interface" );
你好,
非常感谢您对正在发生的事情的完整描述以及对名称空间的解释。
我真的没有完全理解“这里的默认名称 (1)”到底是什么意思。 学到了新东西。
再次感谢你。
安迪
JSL 不同于许多其他编程语言,因为它不像 Python 那样进行自动范围控制。在这种情况下,您正在使用该行
(测试<<顶级父级)[listboxbox(1)] <<设置脚本(...将脚本添加到列表框。当此脚本确实运行时(通过用户选择一个项目),则必须解析该脚本中的任何变量——这就是作用域的用武之地。在 Python 中,每个函数都有一个局部作用域,每个作用域都知道它的父作用域和全局作用域(并且作用域是持久的),因此函数中的变量可以访问父作用域或全局作用域中的变量。JSL 不会这样做——函数不会创建和记住作用域,而且任何创建的作用域都不会保留创建它的作用域的记录。对于 JSL,当访问一个无作用域的变量时(通过命名空间:变量或者作为作用域(命名空间,变量)那么它将默认转到这里或全球范围,仅此而已。
未限定范围的名称的范围查找是这样的:查看本地名称空间是否存在(如果您在当地的( {}, ... )功能或功能({},{默认本地},...)功能是最常见的),看看这里命名空间(如果存在),查看全局命名空间。有时它会查看列名(例如在对于每一行()功能)。
在您的文件中,您不使用任何自动范围快捷方式(例如名称默认为此处 ( 1 ) ), 所以每个变量都是全局范围的。因此,当列表框脚本运行它可以找到测试因为它看起来在全球范围内。但是,插件脚本默认使用名称默认为此处 ( 1 )功能是否它在脚本文件中。在此范围内,文件这里一旦脚本完成,命名空间将被删除,并且列表框找不到脚本测试在它有权访问的任何范围内(即它自己的这里命名空间和全局命名空间)。您可以关闭名称默认为此处 ( 1 )在插件版本中,但我建议不要这样做,最好明确控制范围。
也就是说,要禁用名称默认为此处 ( 1 )在插件版本中,取消选中以下框:
