Enregistrer un nouveau script pour conserver les variables pour plus tardBonjour,
J'ai construit un script qui effectue une analyse des données mais nécessite diverses entrées utilisateur pour sa configuration. Il existe des cas où je souhaite effectuer une analyse similaire ultérieurement, mais sans avoir besoin de ressaisir tous mes paramètres. Le script principal peut déjà lire les variables existantes et remplir automatiquement ces champs, donc si j'ai un moyen de sauvegarder et d'importer ces valeurs par défaut, je serai défini. Je veux pouvoir avoir plusieurs configurations différentes et ne pas avoir besoin de modifier le script lui-même pour en créer un nouveau.
Une idée était de sauvegarder un tableau avec une colonne de noms de variables et une colonne de leurs valeurs, mais cela ne fonctionnait pas bien avec différents types de variables (nombres, chaînes, listes).
Une idée plus intéressante consiste à enregistrer d'autres fichiers .jsl contenant les paramètres par défaut pour différents cas d'utilisation dans un espace de noms partagé, puis à exécuter celui correspondant avant d'exécuter mon script principal. J'aimerais pouvoir créer le fichier de configuration à partir de mon script, plutôt que de le créer manuellement.
J'ai trouvé cet autre article sur la sauvegarde de nouveaux fichiers JSL. https://community.jmp.com/t5/Discussions/how-do-you-create-a-new-script-file-from-jsl/td-p/34740
Il semble que je devrais pouvoir configurer un devis JSL, puis remplacer les valeurs actuelles des variables dans ce devis, mais NameExpr ne fonctionne pas pour cela. Les chaînes sont remplacées sans guillemets, les listes apparaissent simplement sous forme de liste et les nombres sont ignorés. Y a-t-il un léger changement qui permettrait que cela fonctionne, ou une meilleure façon d'atteindre le même objectif ?
Merci!
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 );Automatisation et scriptsles fenêtresRe : Enregistrer un nouveau script pour conserver les variables pour plus tardJe ne sais pas à quel point c'est universel, mais cela fonctionne sur votre script simple
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 : Enregistrer un nouveau script pour conserver les variables pour plus tardAvez-vous peut-être envisagé de stocker ces valeurs dans un tableau associatif ? Il est probablement plus facile à gérer et peut être enregistré par exemple au format JSON si nécessaire.
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);
Vous pouvez ensuite créer quelques fonctions telles que save_settings, load_settings, ... si nécessaire.
Re : Enregistrer un nouveau script pour conserver les variables pour plus tardGrâce à Jarmo et Jim, ces deux solutions fonctionnent. J'ai d'abord utilisé la solution de Jim, qui était capable de se connecter directement à ce que j'avais initialement. Après quelques révisions, j'ai adapté l'idée de Jarmo qui était effectivement plus simple à gérer. Voici ce avec quoi j'ai fini. Avec cette configuration, je n'avais pas besoin de l'espace de noms, mais cela fonctionnerait toujours avec les espaces de noms.
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);