Manuale di Gretl: Gnu Regression, Econometrics and Time-series Library | ||
---|---|---|
Indietro | Capitolo 10. Costrutti loop | Avanti |
Il modo più semplice di controllare un loop consiste nello specificare direttamente il numero di volte che il ciclo deve essere ripetuto, in un cosiddetto "loop limitato". Il numero di ripetizioni può essere una costante numerica, ad esempio loop 1000, o può essere letto da una variabile, come in loop volte.
Se il numero di ripetizioni è indicato da una variabile, ad es.
volte
, la variabile dovrebbe essere uno scalare
intero: se si usa una serie, viene letto il primo valore, e se
questo non è intero, viene troncata la sua parte decimale. Si noti
che volte
viene valutata solo una volta, quando
il loop viene impostato.
Un secondo tipo di espressione di controllo consiste nell'uso del comando while seguito da una disuguaglianza, in cui il termine a sinistra è il nome di una variabile predefinita, mentre il lato destro può essere una costante numerica o il nome di un'altra variabile predefinita. Ad esempio:
loop while differ > .00001
L'esecuzione del ciclo di comandi continuerà fintanto che la condizione specificata rimane vera. Se il termine a destra della disuguaglianza è una variabile, essa viene valutata all'inizio di ogni nuova iterazione del ciclo.
Un terzo tipo di controllo di un loop utilizza la speciale
variabile indice i
. In questo caso, vengono
specificati valori iniziali e finali per i
, che
viene incrementata di uno ogni volta che viene eseguito il ciclo.
La sintassi è la seguente: loop i=1..20.
La variabile indice può essere usata all'interno del corpo del
loop, in uno dei modi seguenti: è possibile accedere al valore di
i
(si veda l'Esempio 10-4), oppure è possibile usare la sua
rappresentazione come stringa $i (si veda l'Esempio 10-5).
I valori iniziale e finale per l'indice possono essere indicati in forma numerica, o come riferimento a variabili predefinite. Nell'ultimo caso, le variabili vengono valutate una volta, quando il loop viene impostato. Inoltre, con dataset di serie storiche è possibile indicare i valori iniziale e finale sotto forma di date, ad esempio: loop i=1950:1..1999:4.
Anche il terzo tipo di controllo usa la variabile interna
i
, che in questo caso può assumere valori solo
all'interno di una lista specifica di stringhe. Il loop è eseguito
una volta per ogni stringa presente nella lista, agevolando l'esecuzione
di operazioni ripetitive su un gruppo di variabili. Ecco un esempio:
loop foreach i mele pere pesche print "$i" endloop
Questo loop verrà eseguito tre volte, mostrando "mele", "pere" e "pesche" ad ogni iterazione.
Per eseguire un loop su una lista di variabili contigue nel dataset, è possibile indicare i nomi della prima e dell'ultima variabile nella lista, separate da "..", invece di dover indicare tutti i nomi. Ad esempio, ipotizzando di avere 50 variabili AK, AL, …, WY, che contengono livelli di reddito per gli stati degli USA, per stimare una regressione del reddito sul tempo per ognuno degli stati, basta eseguire:
genr time loop foreach i AL..WY ols $i const time endloop
L'ultimo tipo di controllo usa una forma semplificata dell'istruzione for del linguaggio di programmazione C. L'espressione di controllo si compone di tre parti, separate da punto e virgola. La prima parte specifica una condizione iniziale, espressa per mezzo di una variabile di controllo; la seconda parte imposta una condizione di continuazione (espressa in funzione della stessa variabile di controllo), mentre la terza parte specifica un incremento (o un decremento) per la variabile di controllo, da applicare ogni volta che il ciclo viene eseguito. L'intera espressione deve essere racchiusa tra parentesi. Ad esempio:
loop for (r=0.01; r<.991; r+=.01)
La variable r
assumerà i valori 0.01, 0.02,
…, 0.99 nel giro di 99 iterazioni. Si noti che a causa della
precisione limitata dell'aritmetica in virgola mobile usata dal
computer, può dover essere necessario usare una condizione di
continuazione come quella mostrata sopra,
r<.991, invece della più
"naturale" r<=.99 (usando numeri in
doppia precisione su un processore x86, quando ci si aspetta che
r
valga 0.99, potrebbe in realtà valere
0.990000000000001).
Altre regole per i tre componenti dell'espressione di controllo: (1) la condizione iniziale deve avere forma X1 = Y1, dove Y1 deve essere una costante numerica o una variabile predefinita. Se la variabile X1 non esiste, viene creata automaticamente. (2) La condizione di continuazione deve avere la forma X1 operatore Y2, dove l'operatore può essere <, >, <= o >= e Y2 deve essere una costante numerica o una variabile predefinita (nel caso in cui sia una variabile, essa viene valutata ad ogni esecuzione del ciclo). (3) L'espressione che indica l'incremento o il decremento deve avere la forma X1 += DELTA, oppre X1 -= DELTA, dove DELTA è una costante numerica o una variabile predefinita (nel secondo caso, essa viene valutata solo una volta, quando il loop viene impostato).