Hallo,
Dank der anderen Board-Benutzer habe ich ein Skript, das Spaltenumschalter und lokale Datenfilter enthält. Das Skript funktioniert wie vorgesehen und der nächste Schritt ist, dass ich es als Add-In für die Client-Basis verpacken wollte. Ich denke, ich habe Details zum Add-In, das funktioniert, und ich kann das Skript starten, und es geht den Datenimport, die Bereinigung und Zusammenfassung durch und stellt die Schnittstelle her. JEDOCH gibt mir die Schnittstelle jetzt Fehler, wenn ich versuche, den Spaltenumschalter auszuführen, der gut funktioniert hat, wenn ich das Skript selbst starte. Wenn ich im Spaltenumschalter auf ein neues Element klicke, erhalte ich die folgende Fehlermeldung: Ich habe den Code angehängt, der diese Ansicht erstellt. In meinem Code hänge ich dies an eine zusammenfassende Datentabelle an und führe sie dann innerhalb des Skripts aus. Wenn ich über das Add-In laufe (wo ich gerade das Skript angehängt habe), gibt es einen Fehler. Wenn ich dann dieses Fenster schließe und auf die Schaltfläche in der Datentabelle klicke, um dieselbe Anzeige zu erstellen, funktioniert sie wie beabsichtigt ohne Fehler. Also bin ich ein bisschen verwirrt, was ich ändern sollte und Erkenntnisse?
Andy

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 unterscheidet sich von vielen anderen Programmiersprachen dadurch, dass es keine automatische Bereichssteuerung durchführt, wie es beispielsweise Python tun könnte.In diesem Fall verwenden Sie die Linie
(test << top parent)[listboxbox( 1 )] << set script(... , um ein Skript zum Listenfeld hinzuzufügen.Wenn dieses Skript ausgeführt wird (indem der Benutzer ein Element auswählt), muss jede Variable innerhalb dieses Skripts aufgelöst werden – hier kommt der Bereich ins Spiel.In Python hat jede Funktion einen lokalen Geltungsbereich und jeder Geltungsbereich kennt seinen übergeordneten Geltungsbereich und den globalen Geltungsbereich (und Geltungsbereiche sind persistent), sodass eine Variable in einer Funktion auf Variablen im übergeordneten oder globalen Geltungsbereich zugreifen kann.JSL tut dies nicht – Funktionen erstellen und merken sich keine Bereiche, und jeder erstellte Bereich speichert nicht den Bereich, der ihn erstellt hat.Wenn für JSL auf eine Variable ohne Bereichseinschränkung zugegriffen wird (entweder durch Namensraum: Variable oder As Scoped( Namensraum, Variable ) dann wird es standardmäßig zu gehen Hier oder globaler Geltungsbereich und das war's.
Die Bereichssuche für Namen ohne Bereichseinschränkung sieht ungefähr so aus: Sehen Sie sich den lokalen Namensraum an, falls vorhanden (wenn Sie sich in einer Lokal( {}, ... ) Funktion bzw Funktion( {}, {Default Local}, ... ) Funktion sind die häufigsten), sehen Sie sich die an Hier Namespace (falls vorhanden), sehen Sie sich den globalen Namespace an.Manchmal sieht es nach Spaltennamen aus (z. B. in a Für jede Reihe() Funktion).
In Ihrer Datei verwenden Sie keine Auto-Scoping-Verknüpfungen (wie z Namen standardmäßig hier( 1 ) ), sodass jede Variable einen globalen Gültigkeitsbereich hat.Wenn also die Listenfeld Skriptläufe, die es finden kann Prüfung weil es im globalen Bereich aussieht.Add-In-Skripte verwenden jedoch standardmäßig die Namen standardmäßig hier( 1 ) Funktion ob oder nicht Es ist in der Skriptdatei.Unter diesem Geltungsbereich werden die Dateien Hier Namespace wird gelöscht, sobald das Skript beendet ist, und die Listenfeld Skript kann nicht finden Prüfung in jedem Bereich, auf den es Zugriff hat (nämlich seine eigene Hier Namensraum und der globale Namensraum).Sie können die ausschalten Namen standardmäßig hier( 1 ) in der Add-In-Version, aber ich rate davon ab und es ist besser, den Bereich explizit zu steuern.
Das heißt, um die zu deaktivieren Namen standardmäßig hier( 1 ) Deaktivieren Sie in der Add-In-Version das folgende Kontrollkästchen:

Hi,
Vielen Dank für Ihre vollständige Beschreibung dessen, was passiert ist, und die Erklärung der Namespaces.
Ich habe wirklich nicht ganz verstanden, worum es bei „Names Default to Here (1)“ wirklich geht. Etwas Neues gelernt.
Danke nochmal.
Andy