Ciao a tutti,
Ho difficoltà con le variabili che vengono valutate normalmente in un Expr1() che non vengono valutate correttamente in un altro Expr2() che chiama il primo Expr. Ho del codice in cui ho definito un Expr1() che genera distribuzioni di colonne di interesse. Più tardi avrò un'altra espressione, Expr2() che richiama Expr1(). Ci sono variabili in Expr1() che sembrano non valutare correttamente in Expr2().
Per un oggetto visivo, Expr2() genera una finestra simile alla seguente:

La prima espressione, Expr1() è ciò che genera la piattaforma di distribuzione inclusa sotto il generatore di grafici. La casella combinata e le caselle dei pulsanti sotto le distribuzioni consentono all'utente di alternare tra diverse statistiche di adattamento, come diversi R^2, RMSE, Mean Abs Dev, -Logliklihood, ecc. Il mio intento è aggiornare di conseguenza sia il GB che la distribuzione. Il GB si aggiorna in modo appropriato, ma la distribuzione no. Quando si modifica la statistica di adattamento in RMSE, ad esempio, questo è il risultato:

Aggiorna i grafici di distribuzione, ma utilizza l'impostazione della dimensione predefinita e non l'impostazione della dimensione che ho stabilito in Expr1(). dovrebbe assomigliare a questo dove i grafici di distribuzione hanno le stesse dimensioni della prima immagine:

La sezione di codice in Expr1() dove vengono generate le Distribuzioni è la seguente:
//this part gets column names to insert into Dispatch() below<BR />sfitcol1 = Column( NNYCol + NNcolshift ) << Get Name;
sfitcol2 = Column( NNYCol + 1 + NNcolshift ) << Get Name;
sfitcol3 = Column( NNYCol + 2 + NNcolshift ) << Get Name;<BR /><BR />//in this example, the results are:<BR />//"RMSE Training"<BR />//"RMSE Validation"<BR />//"RMSE Test"
<BR />//this part generates the Distributions that will be used to change my output report in Expr2()
dt_results << Distribution(
Continuous Distribution( Column( Eval( NNYCol + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 1 + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 2 + NNcolshift ) ), Quantiles( 0 ) ),
SendToReport(
Dispatch( {sfitcol1}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol1}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} )
)
);Se eseguo Expr1() da solo, funziona perfettamente, il problema è che quando Expr2() chiama Expr1() fallisce a causa del modo in cui non valuta le variabili sfitcol# in Dispatch, quindi non cambia la dimensione del FrameBox come dovrebbe essere nel codice.
La sezione di codice in Expr2() che scambia le distribuzioni (usando solo la casella combinata) è la seguente:
NNycb = Combo Box(
NNylist,
<<SET></SET>
Giocare inserendo la parte di Expr1() nella funzione Combo Box e poi provando a eseguire le variabili sfitcol e quindi inviandole al report per modificare la frame box restituisce questo errore nel registro incorporato:
Impossibile trovare l'elemento "sfitcol1" nel contesto della struttura {sfitcol1}
Impossibile trovare l'elemento "sfitcol1" nel contesto della struttura {sfitcol1}
Impossibile trovare l'elemento "sfitcol2" nel contesto della struttura {sfitcol2}
Impossibile trovare l'elemento "sfitcol2" nel contesto della struttura {sfitcol2}
Impossibile trovare l'elemento "sfitcol3" nel contesto struttura {sfitcol3}
Impossibile trovare l'elemento "sfitcol3" nel contesto struttura {sfitcol3}
Se poi inserisco manualmente il nome della colonna, ad esempio con il primo Dispatch: Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)}), allora cambierà la scatola del telaio di conseguenza.

Quindi, è possibile, e dovrebbe funzionare, come ho definito le cose in Expr1(), ma la variabile e non il valore (testo) della variabile viene passata durante l'esecuzione di cose in Expr2(). Spero di ricevere qualche suggerimento su come correggere questo problema. Non penso di aver bisogno di usare una soluzione di tipo Eval(Substitute(Expr())), ma forse lo faccio.
Qualsiasi pensiero/idea/suggerimento è molto apprezzato.
Grazie!,
DS
Eviterei di impostare le dimensioni dei frame durante la creazione delle distribuzioni e di modificarle dopo aver creato le distribuzioni. Poiché stai impostando framebox specifici su dimensioni specifiche, dovrebbe essere abbastanza semplice utilizzare XPath per ottenere i riferimenti e quindi modificare le dimensioni.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Continuous Distribution(Column(:height), Quantiles(0)),
Continuous Distribution(Column(:weight), Quantiles(0))
);
wait(1); // demo purposes
rep = Report(dist);
(rep << XPath("//FrameBox[@helpKey='Distrib Histogram']")) << Frame Size(60, 100);
(rep << XPath("//FrameBox[@helpKey='Distrib Outlier Box']")) << Frame Size(30, 100);
wait(0);
dist << get xml;
Per quanto riguarda il problema che stai affrontando, dovrei scrivere uno script di test per essere sicuro, ma suppongo che dovresti valutare quei valori lì.
CIAO @jthi ,
Grazie ancora per la rapida risposta e la soluzione al mio problema. Il comando XPath è davvero interessante e, leggendo semplicemente la breve voce Scripting Index su di esso, posso vedere che devo leggere di più su XPath e su come trarne il massimo. Nota a margine: se ne è già parlato nello Scripter's Club? Altrimenti potrebbe essere un buon argomento.
Ad ogni modo, ho modificato il tuo codice per essere più vicino alla situazione che ho a portata di mano e funziona perfettamente. Vedere la versione modificata di seguito, che ha Espr2 che chiama Espr1 e quindi all'interno di Espr2, è la modifica per la dimensione del frame di distribuzione.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Expr1 = Expr(
dist = dt << Distribution(
Continuous Distribution( Column( :height ), Quantiles( 0 ) ),
Continuous Distribution( Column( :weight ), Quantiles( 0 ) )
)
);
Expr2 = Expr(
Nwin = New Window( "Dists", Outline Box( "Results", Expr1 ) );
Wait( 1 ); // demo purposes
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
);
Expr2;
Una cosa da notare per chiunque non lo sappia è che non è possibile avere la parte XPath del codice all'interno dell'oggetto New Window().
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
Quella parte del codice deve trovarsi all'esterno della Nuova finestra. Nel mio caso particolare, ho scoperto che dovevo includerlo come parte della funzione quando vengono premuti la casella combinata o i pulsanti Precedente/Successivo, altrimenti ridimensiona le distribuzioni alla loro dimensione originale. Ad esempio, per l'opzione Casella combinata, appare così:
NNycb = Combo Box(
NNylist,
<<SET></SET>
C'è un breve momento in cui le distribuzioni vengono ridimensionate ai valori predefiniti quando vengono anteposte per la prima volta alla finestra, ma poi vengono ridimensionate correttamente molto rapidamente.
Grazie ancora per l'aiuto e apprezzo sempre l'apprendimento di nuove cose nel forum di discussione di JMP.
Grazie!,
DS
Penso di aver trattato XPath molto brevemente nella sessione 7 (livello di report), ma penso che l'accesso e l'attraversamento del livello di report sia un buon argomento per altre sessioni più lunghe. Xpath è fondamentalmente un linguaggio proprio e una delle competenze che si traducono direttamente da JSL ad altri linguaggi di programmazione (regex è un altro esempio) Tutorial su XPath (w3schools.com) . Quando si accede al livello di report in JMP utilizzando << XPath è possibile ottenere facilmente un file elenco di riferimenti ed è possibile inviare messaggi all'elenco, il che lo rende molto utile. È possibile creare "percorsi" robusti (sostanzialmente ottenere riferimenti) a diverse finestre di visualizzazione combinando << Ottieni XML con << XPath.