Qualcuno nel forum delle comunità SAS lo ha chiesto. Volevano scrivere uno script che creasse un report del Generatore di grafici senza sapere in anticipo quante variabili sarebbero presenti. Cioè, non avrebbero saputo quante variabili c'erano quando stavano scrivendo lo script, ma lo script ne avrebbe saputo quante in fase di esecuzione.
Il tentativo originale conteneva uno script del Costruttore di grafici all'interno di un ciclo sulle colonne, ma avviava il Costruttore di grafici n volte, una per ogni iterazione del ciclo. Invece, devi costruire in qualche modo un singolo script che tenga conto del numero variabile di colonne e quindi eseguire quello script. JSL supporta questo tipo di metaprogrammazione (uno script che crea un altro script) utilizzando le funzioni Expr(), Name Expr() e Eval Expr(). Queste sono funzioni piuttosto avanzate ma anche piuttosto potenti.
Per prima cosa creiamo un report rappresentativo del Generatore di grafici e salviamo il suo script:
Costruttore di grafici(
Mostra Pannello di controllo( 0 ),
Variabili(
X(:Paese),
Y( :Punteggio, Lato( "Destra") ),
Y(:Salto in lungo, Posizione(1)),
Y (: Lancio del peso, Posizione (1))
),
Elementi(
Punti( X, Y( 2 ), Y( 3 ), Legenda( 1 ) ),
Linea( X, Y( 1 ), Legenda( 2 ) )
)
);
Quindi prendiamo nota delle parti che vogliamo parametrizzare, in questo caso le variabili Y, e utilizziamo uno script per creare quella parte in base alle informazioni di runtime e quindi incollarla nell'espressione complessiva.
// una tabella con molte colonne
dt = Apri("$SAMPLE_DATA/Decathlon.jmp");
// un'espressione per le variabili del grafico
vars = Espr(Variabili( X( :Paese ), Y( :Punteggio, Lato( "Destra") ) ) );
// un'espressione per gli elementi Points
punti = Espr( Punti( X, Jitter( 1 ) ) );
// un ciclo per inserire a livello di codice variabili in tali espressioni
prima col = 4;
ultima colonna = 6;
For( i = prima colonna, i <= ultima colonna, i++,
Inserisci in (vars, Eval Expr( Y( Expr( Colonna( dt, i ) ), Posizione( 1 ) ) ) );
Inserisci in( punti, Eval Espr( Y( Espr( i - prima col + 2 ) ) ), 1 + i - prima col );
);
//Mostra(vars, punti);
// crea l'espressione del Costruttore di grafici da questi
gb = EsprVal(
Costruttore di grafici(
Mostra Pannello di controllo( 0 ),
Espr( Nome Espr( vars ) ),
Elementi( Espr( Nome Espr( punti ) ), Linea( X, Y( 1 ) ) )
)
);
//mostra(gb);
GB; // esegue l'espressione
Ci sono modi per ottenere lo stesso effetto. Una tecnica simile ma spesso più semplice da comprendere consiste nel costruire lo script come una stringa di testo e quindi richiamare Parse() ed Eval() una volta terminato. Un altro modo: il Costruttore di grafici supporta anche messaggi come Aggiungi variabile che possono modificare un report del Costruttore di grafici già costruito.