Hallo,
Dank der anderen Board-Benutzer habe ich ein funktionierendes Skript, das Spaltenumschalter und lokale Datenfilter enthält. Das Skript funktioniert wie vorgesehen und im nächsten Schritt wollte ich es als Add-In für den Kundenstamm verpacken. Ich denke, ich habe die Details des funktionierenden Add-Ins und kann das Skript starten. Es durchläuft den Datenimport, die Bereinigung und Zusammenfassung und erstellt die Schnittstelle. JEDOCH gibt die Schnittstelle jetzt Fehler aus, wenn ich versuche, den Spaltenumschalter auszuführen, der problemlos funktionierte, wenn ich das Skript allein startete. 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 es dann aus dem Skript heraus aus. Wenn ich es über das Add-In ausführe (wo ich gerade das Skript angehängt habe), gibt es einen Fehler. Wenn ich dann das Fenster schließe und auf die Schaltfläche in der Datentabelle klicke, um dieselbe Anzeige zu erstellen, funktioniert sie wie vorgesehen und ohne Fehler. Ich bin also etwas verwirrt, was ich ändern sollte und welche Erkenntnisse ich habe?
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" );
Hallo,
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)“ eigentlich geht. Etwas Neues gelernt.
Danke nochmal.
Andy
JSL unterscheidet sich von vielen anderen Programmiersprachen darin, 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üfen 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üfen 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:
