Hallo. Ich habe einige Probleme beim Ändern einiger Optionen der Verteilungsplattform in JSL (z. B. Outlier Box Plot, Normal Quantile Plot usw.). Ich schreibe ein Skript, das es Benutzern ermöglichen würde, Verteilungen für eine beliebige Liste von Spalten zu erstellen. Darüber hinaus möchte ich dem Benutzer die Möglichkeit geben, anzugeben, ob Ausreißer-Boxplots oder Normalquantilplots für alle Diagramme aktiviert sind. Ich habe jedoch einige Probleme und hoffe, dass jemand einen Einblick geben kann.
Fürs Protokoll: Ich verwende JMP Pro 14.3.0 auf einem Mac.
Zuerst habe ich Folgendes versucht:
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),
);Scheint, als hätte es funktionieren sollen, aber das Setzen von „nqplopt“ auf 1 oder 0 hat keine Auswirkung. In meinem Fall wurde das Quantildiagramm beide Male erstellt. Interessant, da diese Option in meinen Einstellungen deaktiviert ist.
Als nächstes habe ich stattdessen versucht, nach der Erstellung eine Nachricht an die Distribution zu senden.
//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
Nach wie vor gibt es keinen Unterschied, wenn nqplopt 1 oder 0 ist. Ich bezweifle, dass dies bei mir überhaupt funktionieren würde, da sich das Objekt „dist“ auf mehrere Distributionen bezieht und ich nicht sicher bin, wie JSL damit umgehen würde, eine Nachricht an diese zu senden.
Zuletzt ging ich zu meiner Lösung über, die gewünschten Ersetzungen mithilfe eines JSL-Zitats zu erzwingen:
//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
Trotzdem, wie ein arbeitsloser Croupier, keine Würfel. Wenn ich die geänderte dist_jst-Zeichenfolge zeige, ist es, als ob der SubstituteInto-Befehl nie ausgegeben worden wäre. Ich bin neugierig, warum das so ist? Ich habe JSL Quote schon oft verwendet, kann aber nicht verstehen, warum diese Änderung scheinbar nicht möglich ist?
Irgendwelche Gedanken oder Problemumgehungen?
@nikles ,
Herzlichen Glückwunsch, dass Sie eine Lösung gefunden haben, die für Sie funktioniert.Nachfolgend finden Sie eine Alternative.
EvalExpr() ersetzt jede Expr(Variable) durch ihren Wert und gibt einen Ausdruck mit Werten zurück.Also ersetzt Eval( EvalExpr() ) die Variablen durch Werte und führt den resultierenden Ausdruck aus.Hinweis: Ich habe „Plattformeinstellungen ignorieren“ (1) hinzugefügt und auskommentiert. Wenn ein Benutzer andere Präferenzen hat als der Skriptersteller, ist der Bericht möglicherweise nicht derselbe. Plattformeinstellungen ignorieren (1) deaktiviert alle Einstellungen für diese Analyse, sodass der Skripter alles angeben muss, was sichtbar sein soll.Es stellt jedoch sicher, dass der Benutzer die gleiche Analyse sieht wie andere Benutzer.
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)),
)) );
Nun ja ... ich habe vielleicht eine Antwort auf meine eigene Frage gefunden. Ich bin immer noch neugierig, warum die JSL-Quote-Route nicht funktioniert hat, aber die Lösung, die ich gewählt habe, bestand darin, stattdessen eine wörtliche Zeichenfolge in Anführungszeichen zu verwenden. Wie hier gezeigt:
//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.
Mir wurde gesagt, dass dies im Allgemeinen nicht als „gute Praxis“ angesehen wird (den gesamten Befehl in Anführungszeichen setzen), aber na ja ... es funktioniert.