Scoping, variabili globali e locali nel linguaggio R

Lo scoping nel linguaggio di programmazione R ha molto a che fare su come le variabili e le funzioni interagiscono in diversi ambienti.

Cos'è lo scoping? Lo "scoping" è un concetto chiave nella programmazione che determina come e dove le variabili e le funzioni sono accessibili nel tuo codice. Nel linguaggio R, questo è particolarmente importante perché influenza come i dati e le funzioni vengono gestiti durante l'esecuzione del codice.

In un programma in R la ricerca delle variabili segue la catena degli ambienti a partire da quello locale fino a raggiungere l'ambiente globale, e se non trova la variabile, genera un errore.

Quindi, devi saper distinguere tra le variabili locali e le variabili globali.

Le variabili locali

Le variabili che esistono solo nelle funzioni in cui sono definite sono anche dette variabili locali.

Le variabili locali non possono essere lette dal programma chiamante, né dalle altre funzioni.

Immagina di avere una funzione che calcola il quadrato di un numero:

calcolaQuadrato <- function(x) {
return(x^2)
}
y <- calcolaQuadrato(3)
print(y)

In questo caso, la variabile `x` è definita all'interno dell'ambiente della funzione `calcolaQuadrato`. E' una variabile locale.

Questo significa che `x` esiste solo all'interno di questa funzione e non è accessibile al di fuori di essa.

Se provi a visualizzare la variabile `x` al di fuori della funzione, il programma restituisce un errore "object 'x' not found"

Le variabili globali

Le variabili definite nel programma principale sono dette variabili globali e sono accessibili anche dalle funzioni chiamate.

Ad esempio, questo programma calcola la radice quadrata della variabile globale z.

calcolaQuadrato <- function() {
return(z^2)
}
z=5
y <- calcolaQuadrato()
print(y)

La funzione restituisce come risultato z^2 dove z è una variabile globale che vale z=5.

Quindi, il risultato finale è 25

25

Questo vuol dire che la variabile globale z viene letta anche dalle funzioni chiamate dal programma.

Tuttavia, se una funzione modifica il valore di z, questa variazione la trasforma temporaneamente in una variabile locale.

Ad esempio, guarda questo programma.

calcolaQuadrato <- function() {
z=z+1
return(z^2)
}
z=5
y <- calcolaQuadrato()
print(y)
print(z)

La funzione aumenta di un'unità la variabile z=z+1 che assume il valore z=6 ma diventa una variabile locale.

Quindi, in questo momento esistono due variabile z, la variabile locale z=6 e la variabile globale z=5 al di fuori della funzione.

La funzione calcola il quadrato di 6 che è uguale a 36

36
5

Quando il controllo torna al programma chiamante, la variabile globale z vale ancora 5.

Pertanto, la variabile globale non è stata modificata dalla funzione.

Closures in R

Una caratteristica interessante di R, dovuta allo scoping lessicale, è la capacità di creare "closures".

Una closure è una funzione insieme all'ambiente in cui è stata creata. Questo permette alle funzioni di "ricordare" lo stato dell'ambiente anche dopo che la funzione esterna è stata eseguita.

Ecco un esempio pratico.

  • creaAddizione <- function(valore) {
  • return(function(x) x + valore)
  • }
  • aggiungiDue <- creaAddizione(2)
  • aggiungiCinque <- creaAddizione(5)
  • print(aggiungiDue(3))
  • print(aggiungiCinque(3)) 

In questo esempio, `aggiungiDue` e `aggiungiCinque` sono closures che "ricordano" il valore che era presente quando sono state create.

La funzione aggiungiDue è una closure creata dalla funzione creaAddizione, che aggiunge un valore fisso (in questo caso, 2) a qualsiasi numero le passi.

Quando chiami aggiungiDue(3), stai in realtà chiamando la funzione interna definita in creaAddizione con x = 3 e valore = 2.

Quindi, il risultato è la somma di questi due numeri 3+2, cioè 5.

5

La funzione aggiungiCinque, invece, è una closure creata dalla funzione creaAddizione che aggiunge 5 a qualsiasi numero le passi.

Quindi, quando chiamo aggiungiCinque(3) restituisce 3+5=8

8

Come sempre in programmazione, la pratica è fondamentale per padroneggiare questi concetti, quindi ti incoraggio a sperimentare con esempi reali per vedere come lo scoping influisce sul comportamento del tuo codice.

Spero che questa guida ti sia stata utile. Se hai altre domande o curiosità su R o su altri argomenti, sono qui per aiutarti.

 
 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin

Il linguaggio R