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

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" );
JSL 与许多其他编程语言不同,它不像 Python 那样进行自动范围控制。在这种情况下,您正在使用该行
(test << top parent)[listboxbox( 1 )] << set script(...将脚本添加到列表框中。当这个脚本运行时(通过用户选择一个项目),那么这个脚本中的任何变量都必须被解析——这就是作用域的来源。在 Python 中,每个函数都有一个局部作用域,每个作用域都知道它的父作用域和全局作用域(并且作用域是持久的),因此函数中的变量可以访问父作用域或全局作用域中的变量。JSL 不这样做——函数不会创建和记住作用域,并且任何创建的作用域都不会保留创建它的作用域的记录。对于 JSL,当访问无作用域的变量时(通过命名空间:变量要么作为作用域(命名空间,变量)然后它会默认转到这里或全球范围,就是这样。
无作用域名称的作用域查找是这样的:查看本地命名空间是否存在(如果您在当地的( {}, ... )功能或函数({},{默认本地},...)函数是最常见的),看看这里命名空间(如果存在),查看全局命名空间。有时它会查看列名(例如对于每一行()功能)。
在您的文件中,您不使用任何自动范围的快捷方式(例如名称默认为此处(1) ),因此每个变量都是全局范围的。因此,当列表框脚本运行它可以找到测试因为它看起来在全局范围内。但是,插件脚本默认使用名称默认为此处(1)功能不管与否它在脚本文件中。在此范围内,文件这里脚本完成后,命名空间被删除,并且列表框脚本找不到测试在它有权访问的任何范围内(即,它自己的这里命名空间和全局命名空间)。您可以关闭名称默认为此处(1)在插件版本中,但我建议不要这样做,最好明确控制范围。
也就是说,要禁用名称默认为此处(1)在插件版本中,取消选中以下框:

你好,
非常感谢您对正在发生的事情的完整描述以及对命名空间的解释。
我真的没有完全掌握“默认名称(1)”的真正含义。 学到了一些新东西。
再次感谢你。
安迪