你好,
感謝董事會的其他用戶,我有一個包含列切換器和本地數據過濾器的腳本。 該腳本按預期工作,下一步是我想將其打包為客戶端的加載項。 我想我詳細介紹了加載項的工作,我可以啟動腳本,它會完成數據導入、清理和匯總並製作界面。 但是,當我嘗試執行列切換器時,界面現在給了我錯誤,如果我自己啟動腳本就可以正常工作。 如果我單擊列切換器中的新項目,則會收到以下錯誤,我已附加代碼而不是創建此視圖。 在我的代碼中,我將其附加到匯總數據表中,然後從腳本中執行它。 如果我通過加載項(我剛剛附加腳本)運行它會出錯。 如果我然後關閉該窗口並單擊數據表上的按鈕構建相同的顯示,它會按預期工作而不會出現錯誤。 所以我有點困惑我應該改變什麼和見解?
安迪

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)”的真正含義。 學到了一些新東西。
再次感謝你。
安迪