나중에 변수를 보존하기 위해 새 스크립트 저장안녕하세요,
데이터 분석을 수행하지만 구성하려면 다양한 사용자 입력이 필요한 스크립트를 작성했습니다. 나중에 유사한 분석을 수행하고 싶지만 모든 설정을 다시 입력할 필요는 없는 경우가 있습니다. 기본 스크립트는 이미 기존 변수를 읽고 해당 필드를 자동으로 채울 수 있으므로 해당 기본값을 저장하고 가져올 수 있는 방법이 있으면 설정하겠습니다. 여러 가지 다른 구성을 가질 수 있고 새 구성을 만들기 위해 스크립트 자체를 편집할 필요가 없기를 원합니다.
한 가지 아이디어는 변수 이름 열과 해당 값 열이 포함된 테이블을 저장하는 것이었지만, 이는 다양한 변수 유형(숫자, 문자열, 목록)에서는 잘 작동하지 않았습니다.
더 좋아 보이는 아이디어는 다양한 사용 사례에 대한 기본 설정이 포함된 다른 .jsl 파일을 공유 네임스페이스에 저장한 다음 기본 스크립트를 실행하기 전에 관련 파일을 실행하는 것입니다. 수동으로 구성 파일을 만드는 대신 스크립트 내에서 구성 파일을 만들 수 있기를 원합니다.
새 jsl 파일 저장에 관한 다른 게시물을 찾았습니다. https://community.jmp.com/t5/Discussions/how-do-you-create-a-new-script-file-from-jsl/td-p/34740
JSL 견적을 설정한 다음 변수의 현재 값을 해당 견적으로 대체할 수 있어야 하지만 NameExpr이 작동하지 않는 것 같습니다. 문자열은 따옴표 없이 대체되며 목록은 목록으로 표시되고 숫자는 무시됩니다. 이 작업을 수행할 수 있는 약간의 변화가 있습니까, 아니면 동일한 목표를 달성하는 더 나은 방법이 있습니까?
감사해요!
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);