La boucle if/loop ne fonctionne pas à l'intérieur de GraphBox.Chers utilisateurs de JMP, voici une simplification d'un problème que je rencontre actuellement dans un de mes scripts :
J'essaie d'encoder la création d'une boîte graphique à l'intérieur d'une fonction (ici ' Test '), afin de pouvoir ensuite parcourir facilement ce processus en boucle.
Cependant, ce fragment de code ne fonctionne pas car les variables à l'intérieur du « If » ( afficherHorLines , numReferenceLines ) ne semblent pas être évaluées correctement, voire pas du tout. C'est le cas même si les autres variables que j'utilise dans les arguments de la fonction ( largeur , hauteur ) fonctionnent comme prévu, ce qui m'a amené à conclure que le problème vient du « If » à l'intérieur du GraphBox.
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);
Existe-t-il un moyen de résoudre ce problème sans transformer le Graph Box en un autre objet ?
Si possible, il serait également souhaitable que cela reste une fonction, car j'ai déjà essayé une approche similaire avec Eval, EvalExpr et Expr, ce qui n'a pas fonctionné non plus et a abouti au même résultat.
Cordialement
Automatisation et scriptageAnalyse et modélisation de données de baseExploration et visualisation des donnéesRe : La boucle if/loop ne fonctionne pas dans GraphBoxJe suggère d'utiliser Eval( Eval Expr() ). Cela a fonctionné pour moi.
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 );
Re : La boucle if/loop ne fonctionne pas dans GraphBox@nozellot Explication rapide : le graphique continuera d'exister longtemps après la fin de la fonction Test. Les paramètres de Test disparaissent lorsque Test se termine. Le script associé au graphique ne pourra donc plus les retrouver.
@mmarchandFSLR utilise ma solution préférée pour convertir les paramètres en leurs valeurs. En les identifiant avec
Expr( showHorLines )
et en enveloppant cela avec
Eval Expr( ... )
qui évalue toutes les expressions expr() et conserve les réponses évaluées, puis utilise
Eval( ... )
Pour exécuter la fonction GraphBox() avec une expression contenant des constantes au lieu de variables, vous obtenez un graphique qui ne dépend pas de paramètres qui ne sont plus disponibles.