儲存新腳本以保留變數以供日後使用你好,
我建立了一個執行資料分析的腳本,但需要各種使用者輸入進行配置。 在某些情況下,我想稍後執行類似的分析,但不需要重新輸入所有設定。 主腳本已經可以讀取現有變數並自動填入這些字段,因此如果我有某種方法來保存和匯入這些預設值,我就會被設定。 我希望能夠擁有多種不同的配置,而不需要編輯腳本本身來建立新的配置。
一個想法是保存一個包含一列變數名稱和一列變數值的表,但這對於不同的變數類型(數字、字串、列表)來說效果不佳。
一個更好的想法是將包含不同用例的預設設定的其他 .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 );自動化和腳本編寫視窗回覆:儲存新腳本以保留變數以供日後使用我不確定這有多普遍,但它確實適用於您的簡單腳本
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 );回覆:儲存新腳本以保留變數以供日後使用您是否考慮將這些值儲存到關聯數組中? 它很可能更容易管理,如果需要,可以將其儲存為 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...。
回覆:儲存新腳本以保留變數以供日後使用感謝 Jarmo 和 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);