JSL: 分析が一時データに依存している場合、分析が閉じられるとデータが閉じられます...こんにちは、みんな、
背景: 現在、一時データ テーブルを作成していくつかのデータ ポイントを保持し、グラフ ビルダーにフィードする必要があるアドインを作成しています。 ユーザーがグラフ ビルダを閉じると、一時データが消えてしまいます。 グラフ ビルダーの呼び出しを変数に保存すると、簡単に << On Close() を追加して一時データも閉じることができます。
しかし、ユーザーが 2 つの異なる入力に対してアドインを 2 回実行して、2 つの一時データ テーブルと 2 つのグラフ ビルダーを作成すると、奇妙なことが起こります。 この場合、グラフ ビルダーの 1 つを閉じると、間違った一時テーブルが閉じられる可能性があります (他のグラフ ビルダーも一緒に停止します)。
これには簡単な解決策が必要だと思います。 解決策は名前空間を使用する必要があると思いますが、すべてをリンクしたままにする方法がわかりません! 新しい名前空間を作成するたびに、「ns」が上書きされるようです。 私が抱えている難問は、アドインの各個別のインスタンスを独自の「ns」値を使用して保持する方法を考え出すことであり、正しい「ns」値をいくつかの「On Close」のそれぞれにフィードできるようにすることです。 "コードが作成されます。
これが私がやろうとしていることの単純化されたバージョンです。 これを実行し、[別のものを作成] ボタンを 1 回以上クリックしてから、グラフ ビルダーの 1 つを閉じると、他のグラフ ビルダーはそのまま残ります。どのグラフかを気にする必要はありません。ビルダーは、最初に却下することにしました。
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();
知恵を求めて: 次に何を試すべきですか?
スクリプティングRe:JSL: 分析が一時データに依存している場合、分析が閉じられたときにデータを閉じる...これは素晴らしい「機能」です。 私のコードに実装するのははるかに速く、すべての DisplayBox 変数を置き換える方法を理解するのではなく、作業する名前空間があることを確認するなど、この方法で調整を行うのに 1 時間か 2 時間しかかかりませんでした。楽しみではない)。
このソリューションでは、Open() の後に Wait() を追加し、次に Delete File() を追加しました。これは、新しい実行をトリガーするボタン ボックスが、クリックされるたびに新しい一時ファイルを単純に書き出すためです。
Re:JSL: 分析が一時データに依存している場合、分析が閉じられたときにデータを閉じる...「Names Default to Here()」がコードの呼び出しごとに個別の名前空間を持っていないことに、時々不満を感じます。しかし、コードをデバッグするときにもその事実を利用しています。だから私は両方の利点を見ます。しかし、別の「Here」名前空間を作成するという突飛なアイデアがあります。
元の JSL に //! を追加すると、最初の行として、そのコードはハード ドライブから開くと自動的に実行されます。そのスクリプトを開くと、固有の「ここ」の名前空間があります。ファイルを 2 回目に開くと、独自の一意の "Here" 名前空間があります。
過去数回、私はこれを使用しました????特徴 ????。私のメイン プログラムでは、Save Text File() を使用して問題の JSL を $TEMP の場所に保存します。その後、後続のコードが保存された JSL 内のコードを実行する必要があるときはいつでも、Open() を使用してファイルを実行します。保存された JSL との値の受け渡しは、メイン プログラムと保存された JSL プログラムの両方で定義された名前空間を介して行われます。
これは、この方法で設定された元のサンプルコードです。実行すると、各インスタンスは実行時に独立しています
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");
Re:JSL: 分析が一時データに依存している場合、分析が閉じられたときにデータを閉じる...ありがとう。 これは、このような単純なソリューションに役立ちます。
大規模なコードの書き直しが必要になるかもしれませんが、それでもやりたいことを実行できるかどうかわかりません。 私の実際のアドインは、一連の DisplayBox 参照も ns に格納し、DisplayBox はプラットフォームとデータ テーブルの両方でさまざまな追加アクションをトリガーします。 アドインの再起動時にも、すべての DisplayBox 参照が共食いされます。 運が良ければ、ほとんどの DisplayBoxes をトリガー関数に変換できるので、この << 親をクリックして、他のボックスにドリルダウンして出力などを更新できると思います。 自分のやっていることを真剣に考え直さなければならないように聞こえます。
Names Default to Here がコードが再実行されるたびに別の Here 名前空間を作成することを望んでいましたが、そうではないようです...
この別の道を歩み始める前に、他に良い選択肢はありますか?
Re:JSL: 分析が一時データに依存している場合、分析が閉じられるとデータが閉じられます...問題は、変数「ns」が関数の 2 回目以降の実行で置き換えられることです。したがって、データ テーブルへの一意の参照を使用する必要があります。以下は、データ テーブルの名前を使用してそれを閉じるコードのバージョンです。
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>