<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Quelqu'un dans le Communautés SAS le forum a demandé ceci. Ils voulaient écrire un script permettant de créer un rapport Graph Builder sans savoir à l'avance combien de variables il y aurait. Autrement dit, ils ne sauraient pas combien de variables il y avait au moment de l'écriture du script, mais le script en saurait le nombre au moment de l'exécution.
La tentative initiale contenait un script Graph Builder dans une boucle sur les colonnes, mais elle lançait Graph Builder n fois, une fois pour chaque itération de boucle. Au lieu de cela, vous devez d'une manière ou d'une autre construire un seul script qui prend en compte le nombre variable de colonnes, puis exécuter ce script. JSL prend en charge ce type de méta-programmation (un script qui crée un autre script) en utilisant les fonctions Expr(), Name Expr() et Eval Expr(). Ce sont des fonctions assez avancées mais aussi assez puissantes.
Nous créons d’abord un rapport Graph Builder représentatif et enregistrons son script :
Graph Builder(
Show Control Panel( 0 ),
Variables(
X( :Country ),
Y( :Score, Side( "Right" ) ),
Y( :Long Jump, Position( 1 ) ),
Y( :Shot Put, Position( 1 ) )
),
Elements(
Points( X, Y( 2 ), Y( 3 ), Legend( 1 ) ),
Line( X, Y( 1 ), Legend( 2 ) )
)
);
Ensuite, nous notons les parties que nous voulons paramétrer - dans ce cas, les variables Y, et utilisons un script pour créer cette partie en fonction des informations d'exécution, puis nous la collons dans l'expression globale.
// a table with lots of columns
dt = Open( "$SAMPLE_DATA/Decathlon.jmp" );
// an expression for the graph's variables
vars = Expr( Variables( X( :Country ), Y( :Score, Side( "Right" ) ) ) );
// an expression for Points elements
points = Expr( Points( X, Jitter( 1 ) ) );
// a loop to programmitically insert variables into those expressions
first col = 4;
last col = 6;
For( i = first col, i <= last col, i++,
Insert Into( vars, Eval Expr( Y( Expr( Column( dt, i ) ), Position( 1 ) ) ) );
Insert Into( points, Eval Expr( Y( Expr( i - first col + 2 ) ) ), 1 + i - first col );
);
//Show( vars, points );
// build the Graph Builder expression from those
gb = Eval Expr(
Graph Builder(
Show Control Panel( 0 ),
Expr( Name Expr( vars ) ),
Elements( Expr( Name Expr( points ) ), Line( X, Y( 1 ) ) )
)
);
//show( gb );
gb; // execute the expression
Il existe des moyens d'obtenir le même effet. Une technique similaire, mais souvent plus facile à comprendre, consiste à construire le script sous forme de chaîne de texte, puis à appeler Parse() et Eval() lorsque vous avez terminé. Autre méthode : Graph Builder prend également en charge des messages tels que Ajouter une variable qui peuvent modifier un rapport Graph Builder déjà construit.