Salut. Je rencontre des problèmes lors de la modification de certaines options de la plate-forme de distribution dans JSL (par exemple, Outlier Box Plot, Normal Quantile Plot, etc.). J'écris un script qui permettrait aux utilisateurs de créer des distributions pour une liste arbitraire de colonnes. De plus, j'aimerais donner à l'utilisateur la possibilité de spécifier si les tracés en boîte aberrants ou les tracés quantiles normaux sont activés pour tous les tracés. Ayant quelques problèmes cependant et en espérant que quelqu'un puisse offrir un aperçu.
Pour mémoire, j'utilise JMP Pro 14.3.0 sur un Mac.
J'ai d'abord essayé ceci :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
tcol_lis = {"height", "weight"};
//First approach
nqplopt = 1; //This is meant to turn on the Normal Quantile Plot option
Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt),
);
nqplopt = 0; //But it has no effect
Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt),
);On dirait que cela aurait dû fonctionner, mais définir "nqplopt" sur 1 ou 0 n'a aucun effet. Dans mon cas, le graphique quantile a été généré les deux fois. Intéressant puisque cette option est désactivée dans mes préférences.
Ensuite, j'ai essayé d'envoyer un message à la distribution après la création à la place.
//Second approach - send the Normal Quantile option as a message
nqplopt = 1;
dist = Distribution(
Column(EvalList(tcol_lis))
);
dist << Normal Quantile Plot(nqplopt);
nqplopt = 0;
dist = Distribution(
Column(EvalList(tcol_lis))
);
dist << Normal Quantile Plot(nqplopt); //No difference from when nqplopt = 1
Comme auparavant, aucune différence lorsque nqplopt vaut 1 ou 0. Je doute que cela fonctionne pour moi de toute façon puisque l'objet "dist" fait référence à plusieurs distributions et je ne sais pas comment JSL gérerait l'envoi d'un message à cela.
Enfin, je suis allé à ma solution de prédilection, forcer les substitutions que je veux en utilisant un devis JSL :
//Third approach - make substitutions via JSL Quote
nqplopt = 0;
dist_jst = JSL Quote(
Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt_ph),
);
);
SubstituteInto(dist_jst,
Expr(nqplopt_ph), nqplopt
);
Show(dist_jst); //The "nqplopt_ph" remains unchanged for some reason.
Eval(Parse(dist_jst)); //Dist. created with a Normal Quantile Plot, as if nqplopt = 1
Pourtant, comme un croupier au chômage, pas de dés. Lorsque j'affiche la chaîne dist_jst modifiée, c'est comme si la commande SubstituteInto n'avait jamais été émise. Je suis curieux pourquoi est-ce? J'ai déjà utilisé JSL Quote plusieurs fois, mais je ne comprends pas pourquoi il semble incapable de faire cette modification ?
Des idées ou des solutions de contournement?
@nikles ,
Félicitations pour avoir trouvé une solution qui fonctionne pour vous.Vous trouverez ci-dessous une alternative.
EvalExpr() remplace chaque Expr(variable) par sa valeur et renvoie une expression avec des valeurs.Donc Eval( EvalExpr() ) remplace les variables par des valeurs et exécute l'expression résultante.Notez que j'ai ajouté et commenté Ignorer les préférences de la plate-forme (1). Si un utilisateur a des préférences différentes de celles du scripteur, le rapport peut ne pas être le même. Ignorer les préférences de la plate-forme(1) désactive toutes les préférences pour cette analyse, de sorte que le scripteur doit spécifier tout ce qui doit être visible.Cependant, cela garantit que l'utilisateur verra la même analyse que les autres utilisateurs.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
tcol_lis = {"height", "weight"};
//First approach
nqplopt = 1; //This is meant to turn on the Normal Quantile Plot option
Eval(EvalExpr(Distribution( //Ignore Platform Preferences(1),
Column( EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt),
)));
nqplopt = 0; //But it has no effect
Eval( Eval Expr(Distribution(//Ignore Platform Preferences(1),
Column(EvalList(tcol_lis)),
Normal Quantile Plot(Expr(nqplopt)),
)) );
Eh bien... j'ai peut-être trouvé une réponse à ma propre question. Je suis toujours curieux de savoir pourquoi la route JSL Quote n'a pas fonctionné, mais la solution que j'ai adoptée était d'utiliser une chaîne entre guillemets littéraux à la place. Comme montré ici :
//Fourth approach - make substitutions via a literal string quote
nqplopt = 0;
dist_str =
"Distribution(
Column(EvalList(tcol_lis)),
Normal Quantile Plot(nqplopt_ph),
)";
SubstituteInto(dist_str,
"nqplopt_ph", Char(nqplopt)
);
Show(dist_str); //The "nqplopt_ph" is successfully changed to 0.
Eval(Parse(dist_jst)); //Finally, it works.
On me dit que ce n'est généralement pas considéré comme une "bonne pratique" (mettre la commande entière entre guillemets), mais meh ... ça marche.