JSL: Wenn Analysen von temporären Daten abhängig sind, werden Daten geschlossen, wenn die Analyse geschlossen wird ...Hallo zusammen,
Hintergrund: Ich schreibe gerade ein Add-In, bei dem ich eine temporäre Datentabelle erstellen muss, um einige Datenpunkte zu speichern, die dann in Graph Builder eingespeist werden. Wenn der Benutzer den Graph Builder schließt, möchte ich, dass die temporären Daten verschwinden. Ganz einfach: Wenn ich den Graph Builder-Aufruf in einer Variablen speichere, kann ich ein << On Close() hinzufügen, um auch die temporären Daten zu schließen.
Allerdings passieren seltsame Dinge, wenn mein Benutzer das Add-In zweimal für zwei verschiedene Eingaben ausführen möchte und so zwei temporäre Datentabellen und zwei Graph Builder erstellt. In diesem Fall kann es sein, dass beim Schließen eines der Graph Builder die falsche temporäre Tabelle geschlossen wird (wodurch auch der andere Graph Builder heruntergefahren wird).
Ich kann mir vorstellen, dass es dafür eine einfache Lösung geben muss. Ich denke, die Lösung sollte in Namespaces liegen, aber ich weiß nicht, wie ich alles miteinander verknüpfen kann! Es scheint, dass jedes Mal, wenn ich einen neuen Namespace erstelle, das „ns“ überschrieben wird. Das Rätsel, das ich habe, besteht darin, herauszufinden, wie ich jede einzelne Instanz des Add-Ins mit ihrem eigenen „ns“-Wert beibehalten kann, und zwar so, dass ich den richtigen „ns“-Wert in jede der verschiedenen „On Close“-Instanzen einspeisen kann „Codes, die am Ende erstellt werden.
Hier ist eine vereinfachte Version dessen, was ich versuche. Die Idee wäre, dass, wenn ich dies ausführe und dann ein- oder mehrmals auf die Schaltfläche „Einen anderen erstellen“ klicke und dann einen der Graph Builder verlasse, die anderen intakt bleiben – ohne Rücksicht darauf, welcher Graph Baumeister, den ich zuerst entlassen möchte.
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table("Test Table",
<< New Column("Random X", << Formula(Random Normal())),
<< New Column("Random Y", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window("Test Output",
Button Box("Make Another One",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();
Auf der Suche nach Weisheit: Was soll ich als nächstes versuchen?
Qualitäts- und VerfahrenstechnikBetreff: JSL: Wenn Analysen von temporären Daten abhängig sind, werden Daten geschlossen, wenn die Analyse geschlossen wird ...Das ist ein tolles „Feature“. Die Implementierung meines Codes war viel schneller, es dauerte nur ein oder zwei Stunden, um die Anpassungen auf diese Weise vorzunehmen und sicherzustellen, dass ich einen Namespace hatte, mit dem ich arbeiten konnte usw., anstatt herauszufinden, wie ich alle meine DisplayBox-Variablen ersetzen konnte (was ich war). Ich freue mich nicht darauf).
In dieser Lösung habe ich außerdem ein Wait() und dann ein Delete File() nach dem Open() hinzugefügt, da meine Schaltflächenbox, die einen neuen Lauf auslöst, einfach jedes Mal, wenn darauf geklickt wird, eine neue temporäre Datei schreibt.
Betreff: JSL: Wenn Analysen von temporären Daten abhängig sind, werden Daten geschlossen, wenn die Analyse geschlossen wird ...Ich bin manchmal frustriert darüber, dass „Names Default to Here()“ nicht bei jedem Aufruf des Codes separate Namespaces hat.Aber ich nutze diese Tatsache auch beim Debuggen von Code.Ich sehe also beide Vorteile.Aber hier ist eine ungewöhnliche Idee, die separate „Here“-Namensräume erstellt.
Wenn Sie Ihre ursprüngliche JSL nehmen und //! Als erste Zeile wird dieser Code automatisch ausgeführt, wenn er von Ihrer Festplatte geöffnet wird.Wenn dieses Skript geöffnet wird, verfügt es über seinen eindeutigen „Hier“-Namensraum.Wenn Sie die Datei ein zweites Mal öffnen, verfügt sie über einen eigenen, eindeutigen „Here“-Namensraum.
In der Vergangenheit habe ich das schon ein paar Mal benutzt ???? Besonderheit ????.Mein Hauptprogramm verwendet Save Text File(), um die betreffende JSL an einem $TEMP-Speicherort zu speichern, und wann immer der nachfolgende Code den Code in der gespeicherten JSL ausführen muss, verwenden Sie Open(), um die Datei auszuführen.Die Übergabe von Werten an und von der gespeicherten JSL erfolgt über einen Namespace, der sowohl im Hauptprogramm als auch im gespeicherten JSL-Programm definiert ist.
Hier ist Ihr ursprünglicher Beispielcode, der auf diese Weise eingerichtet wurde. Bei der Ausführung ist jede Instanz in ihrer Ausführung unabhängig
names default to here(1);
graphJSL = "//!
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table(\!"Test Table\!",
<< New Column(\!"Random X\!", << Formula(Random Normal())),
<< New Column(\!"Random Y\!", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window(\!"Test Output\!",
Button Box(\!"Make Another One\!",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();";
Save Text File( "$TEMP/Graph1.jsl", graphJSL );
open("$TEMP/Graph1.jsl");
open("$TEMP/Graph1.jsl");
Betreff: JSL: Wenn Analysen von temporären Daten abhängig sind, werden Daten geschlossen, wenn die Analyse geschlossen wird ...Danke. Dies ist für einfache Lösungen wie diese nützlich.
Es kann sein, dass ich vor einer großen Umschreibung des Codes stehe und selbst dann bin ich mir nicht sicher, ob es möglich ist, das zu tun, was ich tun möchte. Mein eigentliches Add-In speichert auch eine Reihe von DisplayBox-Referenzen in ns, und die DisplayBoxes lösen verschiedene zusätzliche Aktionen sowohl auf Plattformen als auch in der Datentabelle aus. Alle DisplayBox-Referenzen werden ebenfalls ausgeschlachtet, wenn das Add-In neu gestartet wird. Ich nehme an, wenn ich Glück habe, kann ich die meisten meiner DisplayBoxen in Triggerfunktionen umwandeln, sodass ich auf dieses << Parent klicken und einen Drilldown zu anderen Boxen durchführen kann, um Ausgaben usw. zu aktualisieren. Es hört sich so an, als müsste ich ernsthaft überdenken, was ich tue.
Ich hatte gehofft, dass Names Default to Here bei jeder erneuten Codeausführung einen separaten Here-Namespace erstellen würde, aber das scheint nicht der Fall zu sein ...
Gibt es noch andere gute Optionen, bevor ich diesen anderen Weg einschlage?
Betreff: JSL: Wenn Analysen von temporären Daten abhängig sind, werden Daten geschlossen, wenn die Analyse geschlossen wird ...Das Problem besteht darin, dass Ihre Variable „ns“ beim zweiten und den folgenden Durchläufen der Funktion ersetzt wird.Daher müssen Sie einen eindeutigen Verweis auf die Datentabelle verwenden.Unten finden Sie eine Version Ihres Codes, die den Namen der Datentabelle zum Schließen verwendet.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>