CIAO. Sto riscontrando alcuni problemi con la modifica di alcune opzioni della piattaforma di distribuzione in JSL (ad esempio Outlier Box Plot, Normal Quantile Plot, ecc.). Sto scrivendo uno script che consentirebbe agli utenti di creare distribuzioni per un elenco arbitrario di colonne. Inoltre, vorrei dare all'utente la possibilità di specificare se Outlier Box Plot o Normal Quantile Plot sono abilitati per tutti i grafici. Tuttavia, ho dei problemi e spero che qualcuno possa offrire qualche spunto.
Per la cronaca, sto eseguendo JMP Pro 14.3.0 su un Mac.
Per prima cosa ho provato questo:
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),
);Sembra che avrebbe dovuto funzionare, ma l'impostazione di "nqplopt" su 1 o 0 non ha alcun effetto. Nel mio caso il grafico quantile è stato generato entrambe le volte. Interessante poiché quell'opzione è disattivata nelle mie preferenze.
Successivamente, ho provato a inviare un messaggio alla distribuzione dopo la creazione.
//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
Come prima, nessuna differenza quando nqplopt è 1 o 0. Dubito che funzionerebbe comunque per me poiché l'oggetto "dist" si riferisce a più distribuzioni e non sono sicuro di come JSL gestirà l'invio di un messaggio a questo.
Infine, sono andato alla mia soluzione di riferimento, forzare le sostituzioni che desidero utilizzando una citazione 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
Eppure, come un croupier disoccupato, niente dadi. Quando mostro la stringa dist_jst modificata, è come se il comando SubstituteInto non fosse mai stato emesso. Sono curioso perché è questo? Ho usato JSL Quote prima molte volte, ma non riesco a capire perché sembra incapace di apportare questa modifica?
Qualche idea o soluzione alternativa?
@nikles ,
Congratulazioni per aver trovato una soluzione che funziona per te.Di seguito è un'alternativa.
EvalExpr() sostituisce ogni Espr(variabile) con il suo valore e restituisce un'espressione con valori.Quindi Eval( EvalExpr() ) con sostituire le variabili con valori ed eseguire l'espressione risultante.Nota che ho aggiunto e commentato Ignore Platform Preferences(1). Se un utente ha preferenze diverse rispetto allo scripter, il report potrebbe non essere lo stesso. Ignore Platform Preferences(1) disattiva tutte le preferenze per questa analisi, quindi lo scripter deve specificare tutto ciò che deve essere visibile.Tuttavia, garantisce che l'utente vedrà la stessa analisi degli altri utenti.
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)),
)) );
Beh...potrei aver trovato una risposta alla mia stessa domanda. Sono ancora curioso di sapere perché il percorso JSL Quote non ha funzionato, ma la soluzione che ho adottato è stata quella di utilizzare invece una stringa tra virgolette letterale. Come mostrato qui:
//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.
Mi è stato detto che questa non è generalmente considerata una "buona pratica" (mettendo l'intero comando tra virgolette), ma meh ... funziona.