保存新脚本以保留变量供以后使用你好,
我构建了一个执行数据分析的脚本,但需要各种用户输入进行配置。 在某些情况下,我想稍后执行类似的分析,但不需要重新输入所有设置。 主脚本已经可以读取现有变量并自动填充这些字段,因此如果我有某种方法来保存和导入这些默认值,我就会被设置。 我希望能够拥有多种不同的配置,而不需要编辑脚本本身来创建新的配置。
一个想法是保存一个包含一列变量名称和一列变量值的表,但这对于不同的变量类型(数字、字符串、列表)来说效果不佳。
一种更好的想法是将包含不同用例的默认设置的其他 .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);