你好,
感謝論壇各位用戶,我有一個包含列切換器和本地數據過濾器的腳本可以運行。該腳本按預期運行,下一步我想將其打包為客戶端的插件。我想我了解插件的工作原理,可以啟動腳本,它會完成資料導入、清理和匯總,並產生介面。但是,現在當我嘗試執行列切換器時,介面會出錯,而如果我單獨啟動腳本,則列切換器可以正常工作。如果我單擊列切換器中的新項目,則會收到以下錯誤。我已附加程式碼然後建立此視圖。在我的程式碼中,我將其附加到摘要資料表,然後從腳本內部執行它。如果我透過插件(我剛剛附加腳本的地方)運行,它會出錯。如果我關閉該視窗並單擊資料表上的按鈕,建立相同的顯示,它會按預期工作而不會出現錯誤。所以我有點困惑,不知道我該改變什麼,有什麼見解?
安迪

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 )在插件版本中,取消選中以下框:
