La funzione If/Loop non funziona all'interno di GraphBox.Cari utenti di JMP, questa è una semplificazione di un problema che sto riscontrando in un mio script:
Sto cercando di codificare la creazione di un riquadro grafico all'interno di una funzione (qui ' Test '), in modo da poter poi iterare facilmente su questo processo.
Tuttavia, questo frammento di codice non funziona perché le variabili all'interno dell'istruzione ' Se ' ( showHorLines , numReferenceLines ) non sembrano essere valutate correttamente, o non vengono valutate affatto. Questo accade nonostante le altre variabili che utilizzo negli argomenti della funzione ( larghezza , altezza ) funzionino come previsto, il che mi ha portato alla conclusione che il problema risiede nell'istruzione ' Se ' all'interno del Graph Box.
Clear Globals();
Names Default To Here( 1 );
Test = Function({width, height, showHorLines, numReferenceLines}, {Default Local},
gb = GraphBox(
FrameSize(width, height),
XScale(0, width),
YScale(0, height),
XName("split"),
YName("color"),
//[] Generate grey horizontal lines
If(showHorLines == 1,
PenColor(65);
For(h = 0, h <= numReferenceLines, h++,
HLine(h*height/numReferenceLines)
);
PenColor(0),
);
);
win = NewWindow("new window", gb);
);
Test(200, 200, 1, 10);
Esiste un modo per risolvere questo problema senza trasformare il Graph Box in un altro oggetto?
Se possibile, sarebbe anche opportuno che rimanesse una funzione, perché una volta ho provato un approccio simile con Eval, EvalExpr e Expr, che non ha funzionato e ha portato a un risultato analogo.
Distinti saluti
Automazione e scriptingAnalisi e modellazione di base dei datiEsplorazione e visualizzazione dei datiOggetto: La funzione If/Loop non funziona all'interno di GraphBoxConsiglierei di usare Eval( Eval Expr() ). Per me ha funzionato.
Names Default To Here( 1 );
Test = Function( {width, height, showHorLines, numReferenceLines},
{Default Local},
Eval(
Eval Expr(
gb = Graph Box(
FrameSize( Expr( width ), Expr( height ) ),
X Scale( 0, Expr( width ) ),
Y Scale( 0, Expr( height ) ),
XName( "split" ),
YName( "color" ),
If( Expr( showHorLines ) == 1,
Pen Color( 65 );
For( h = 0, h <= Expr( numReferenceLines ), h++,
H Line( h * Expr( height ) / Expr( numReferenceLines ) )
);
Pen Color( 0 );
,
)
);
win = New Window( "new window", gb );
)
)
);
Test( 200, 200, 1, 10 );
Oggetto: La funzione If/Loop non funziona all'interno di GraphBox@nozellot breve spiegazione: il riquadro grafico continuerà ad esistere anche dopo l'uscita dalla funzione Test. I parametri di Test scompaiono quando Test termina. Lo script collegato al riquadro grafico non sarà in grado di recuperare i parametri in seguito.
@mmarchandFSLR sta usando la mia soluzione preferita per convertire i parametri nei loro valori. Identificandoli con
Expr( showHorLines )
e avvolgendo il tutto con
Eval Expr( ... )
che valuta tutte le espressioni e lascia indietro le risposte valutate, quindi utilizzando
Eval( ... )
Eseguendo la funzione GraphBox() con un'espressione che contiene costanti anziché variabili, si ottiene un riquadro grafico che non dipende da parametri non più disponibili.