新しいスクリプトを保存して後で使用するために変数を保存するこんにちは、
データ分析を実行するスクリプトを作成しましたが、構成するにはさまざまなユーザー入力が必要です。 後で同様の分析を実行したい場合がありますが、すべての設定を再入力する必要はありません。 メイン スクリプトはすでに既存の変数を読み取り、それらのフィールドに自動入力できるため、これらのデフォルト値を保存してインポートする何らかの方法があれば、設定は完了します。 複数の異なる構成を使用できるようにしたいのですが、スクリプト自体を編集して新しい構成を作成する必要はありません。
1 つのアイデアは、変数名の列とその値の列を含むテーブルを保存することでしたが、これはさまざまな変数タイプ (数値、文字列、リスト) ではうまく機能しませんでした。
より良いと思われるアイデアは、さまざまなユースケースのデフォルト設定を含む他の .jsl ファイルを共有名前空間に保存し、メイン スクリプトを実行する前に関連するファイルを実行することです。 構成ファイルを手動で作成するのではなく、スクリプト内から作成できるようにしたいと考えています。
新しいjslファイルの保存に関する他の投稿を見つけました。 https://community.jmp.com/t5/Discussions/how-do-you-create-a-new-script-file-from-jsl/td-p/34740
JSL 引用符を設定して、変数の現在の値をその引用符に置き換えることができるように思えますが、NameExpr はそのために機能しません。 文字列は引用符なしで置換され、リストは単に List として表示され、数値は無視されます。 これを機能させるためのわずかな変更、または同じ目標を達成するためのより良い方法はありますか?
ありがとう!
names default to here (1);
//namespace for the shared variables
If( !Namespace Exists( "TestNS" ), New Namespace( "TestNS" ) );
//the variables I want to save for later
TestNS:a = 5;
TestNS:b = "text";
TestNS:c = {1,2,3,4};
TestNS:d = {"a","b","c","d"};
//set up script to save as JSL
script = JSL Quote(
TestNS:a = a_dv;
TestNS:b = b_dv;
TestNS:c = c_dv;
TestNS:d = d_dv;
);
//substitute the dummy values for the current values... this isn't working
substitute Into (script, expr(a_dv), nameexpr (TestNS:a));
substitute Into (script, expr(b_dv), nameexpr (TestNS:b));
substitute Into (script, expr(c_dv), nameexpr (TestNS:c));
substitute Into (script, expr(d_dv), nameexpr (TestNS:d));
show(script);
//save script for later use
Save Text File( "$downloads\MyScript.jsl", script );自動化とスクリプト作成ウィンドウズRe: 後で使用するために変数を保存するために新しいスクリプトを保存するこれがどの程度普遍的であるかはわかりませんが、単純なスクリプトでは機能します
names default to here (1);
//namespace for the shared variables
If( !Namespace Exists( "TestNS" ), New Namespace( "TestNS" ) );
//the variables I want to save for later
TestNS:a = 5;
TestNS:b = "text";
TestNS:c = {1,2,3,4};
TestNS:d = {"a","b","c","d"};
//set up script to save as JSL
script = expr(
TestNS:a = a_dv;
TestNS:b = b_dv;
TestNS:c = c_dv;
TestNS:d = d_dv;
);
//substitute the dummy values for the current values... this isn't working
substitute Into (script, expr(a_dv), nameexpr (TestNS:a));
substitute Into (script, expr(b_dv), nameexpr (TestNS:b));
substitute Into (script, expr(c_dv), nameexpr (TestNS:c));
substitute Into (script, expr(d_dv), nameexpr (TestNS:d));
// Move the arguments in the script to a character string
theScript = "";
i=1;
While( char(arg(script,i)) !="Empty()",
theScript = theScript || char(arg(script,i)) || ";";
i++;
);
show(script);
//save script for later use
Save Text File( "$downloads\MyScript.jsl", theScript );Re: 後で使用するために変数を保存するために新しいスクリプトを保存するこれらの値を連想配列に保存することを検討したことはありますか? おそらく管理が容易で、必要に応じて JSON などとして保存できます。
Names Default To Here(1);
//namespace for the shared variables
If(!Namespace Exists("TestNS"),
New Namespace(
"TestNS"
)
);
//the variables I want to save for later
TestNS:settings = Associative Array();
TestNS:settings["a"] = 5;
TestNS:settings["b"] = "text";
TestNS:settings["c"] = [1 2 3 4];
TestNS:settings["d"] = {"a", "b", "c", "d"};
TestNS:settings["e"] = ["key" => 1];
/*
TestNS:settings["a"] = cur_settings["a"];
TestNS:settings["b"] = cur_settings["b"];
TestNS:settings["c"] = cur_settings["c"];
TestNS:settings["d"] = cur_settings["d"];
TestNS:settings["e"] = cur_settings["e"];
*/
myfilepath = Save Text File("$DOWNLOADS/myscript.jsl", As JSON Expr(TestNS:settings));
conf = Load Text File(myfilepath);
loaded_settings = Parse JSON(conf);
必要に応じて、save_settings、load_settings などの関数をいくつか作成できます。
Re: 後で使用するために変数を保存するために新しいスクリプトを保存するJarmo と Jim の両方のおかげで、これらのソリューションは両方とも機能します。 私は当初、最初に持っていたものに直接接続できる Jim のソリューションを使用しました。 いくつかの修正を行った後、私は Jarmo のアイデアを採用し、実際に管理しやすくなりました。 これが私が最終的に得たものです。 この設定では名前空間は必要ありませんでしたが、それでも名前空間を使用できます。
names default to here (1);
//initialize variables
var1 = {"a", "b", "c"};
var2 = 100;
var3 = [1, 2, 3, 4];
//initialize variables used for functions
VarsToExport = {"var1", "var2", "var3"};
SettingsAA = Associative Array();
loaded_settingsAA = .;
SelfPath = Get Default Directory();
//expr to get each variable in the VarsToExport list and input the value into an AA, export as JSON
ExportVarsExpr = expr(
for each({varname}, VarsToExport,
//show(varname);
SettingsAA[varname] = eval(as name(varname));
//show(SettingsAA);
);
VarsSavePath = Pick File(
"Save a file containing current script settings",
SelfPath,
{"JMP Script Files|jsl", "All Files|*"},
1,
1,
"Layer_Settings.jsl"
);
Save Text File(VarsSavePath, As JSON Expr(settingsAA));
);
//expr open a jsl file, parse JSON into an AA and extract saved values
ImportVarsExpr = expr(
VarsImportPath = Pick File(
"Select jsl file that contains the saved parameters",
SelfPath,
{"JMP Script Files|jsl", "All Files|*"},
1,
0,
""
);
loaded_settingsAA = Parse JSON(Load Text File(VarsImportPath));
//for each element of AA, get the name of the element and set a variable with that name to the AA value
for each({varname}, loaded_settingsAA,
eval(parse(Evalinsert("\[ "^varname^"n = loaded_settingsAA << get value (varname) ]\")));
//show(varname);
//show(loaded_settingsAA << get value (varname));
);
);
//show original variables
Write("\!N", "Original:");
show(var1, var2, var2);
//export variables
eval(ExportVarsExpr);
//clear the variables
var1 = .;
var2 = .;
var3 = .;
Write("\!N", "\!N", "Variables cleared:");
show(var1, var2, var2);
//import variables
eval(ImportVarsExpr);
//show that the variables have been imported
Write("\!N", "\!N", "Post loading:");
show(var1, var2, var2);