やあ。 JSL の一部の分布プラットフォーム オプション (外れ値ボックス プロット、正規分位点プロットなど) を変更する際に問題が発生します。 ユーザーが任意の列リストのディストリビューションを作成できるようにするスクリプトを作成しています。 さらに、すべてのプロットに対して外れ値箱ひげ図または正規分位点プロットを有効にするかどうかをユーザーが指定できるようにしたいと考えています。 ただし、いくつか問題があり、誰かが洞察を提供できることを願っています。
記録のために言っておきますが、私は Mac 上で JMP Pro 14.3.0 を実行しています。
まずこれを試してみました:
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),
);うまくいくはずですが、「nqplopt」を 1 または 0 に設定しても効果はありません。 私の場合、分位点プロットは両方の回で生成されました。 私の設定ではそのオプションがオフになっているので興味深いです。
次に、代わりに作成後のディストリビューションにメッセージを送信してみました。
//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
前と同様に、nqplopt が 1 または 0 の場合に違いはありません。オブジェクト「dist」が複数のディストリビューションを参照しており、JSL がそこへのメッセージの送信をどのように処理するかわからないため、これが私にとってうまくいくかどうかは疑わしいです。
最後に、私は頼りになるソリューションに進み、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
それでも、失業中のディーラーのように、サイコロはありません。 変更された dist_jst 文字列を表示すると、SubstituteInto コマンドがまったく発行されなかったかのように見えます。 なぜそうなるのか気になります。 これまで何度も JSL Quote を使用したことがありますが、なぜこの変更ができないのか理解できません。
何か考えや回避策はありますか?
@ニクルズ、
最適なソリューションが見つかりましたこと、おめでとうございます。以下に代替案を示します。
EvalExpr() は、各 Expr(変数) をその値に置き換え、値を含む式を返します。したがって、 Eval( EvalExpr() ) で変数を値に置き換え、結果の式を実行します。Ignore Platform Preferences(1) を追加してコメントアウトしたことに注意してください。 ユーザーの設定がスクリプト作成者と異なる場合、レポートは同じではない可能性があります。 Ignore Platform Preferences(1) は、この分析のすべての設定をオフにするため、スクリプト作成者は表示されるべきものをすべて指定する必要があります。ただし、ユーザーには他のユーザーと同じ分析が表示されることが保証されます。
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)),
)) );
まあ...私自身の質問に対する答えを思いついたかもしれません。 なぜ JSL Quote ルートが機能しなかったのか未だに疑問に思っていますが、私が採用した解決策は、代わりにリテラルの引用符で囲まれた文字列を使用することでした。 ここに示すように:
//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.
これ (コマンド全体を引用符で囲むこと) は一般に「良い習慣」とは考えられていないそうですが、まあ...うまくいきます。