Scope globale e locale
Distingua tra .GlobalEnv, environment delle funzioni e closure.
Scope globale e locale è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.
Variabili locali nelle funzioni
Le variabili assegnate con <- o = all'interno del corpo di una funzione sono locali a quella funzione. Vengono create nell'ambiente della funzione e scompaiono quando la funzione restituisce il risultato. Non modificano mai lo scope del chiamante.
x <- 'global'
f <- function() {
x <- 'local' # creates a new local binding, does not modify global x
cat('Inside f: x =', x, '\n')
}
f()
cat('Outside f: x =', x, '\n') # still 'global'I parametri delle funzioni sono locali
Anche i parametri delle funzioni sono variabili locali. Modificare un parametro all'interno della funzione non modifica l'argomento nell'ambiente del chiamante. R passa gli argomenti per valore (con semantica di copia alla modifica).
double_it <- function(n) {
n <- n * 2 # modifies local copy only
cat('Inside:', n, '\n')
}
my_n <- 5
double_it(my_n)
cat('Outside:', my_n, '\n') # still 5<<- per l'assegnazione globale
<<- (superassegnazione) risale la catena dei genitori e assegna il valore alla prima corrispondenza trovata. Se non esiste alcuna corrispondenza, crea l'associazione nell'ambiente globale. Lo utilizzi con moderazione: un uso eccessivo di <<- rende difficile comprendere il comportamento delle funzioni.
total <- 0
add_to_total <- function(x) {
total <<- total + x
}
add_to_total(10)
add_to_total(25)
add_to_total(5)
cat('Total:', total, '\n')<<- cerca lungo la catena
<<- non assegna automaticamente il valore all'ambiente globale: risale la catena dei genitori e assegna il valore al primo ambiente in cui il nome esiste già. Se la variabile esiste in una funzione esterna, viene aggiornata in quell'ambiente.
outer <- function() {
n <- 0
increment <- function() n <<- n + 1
increment()
increment()
cat('n in outer:', n, '\n') # n was in outer's env, updated there
}
outer()
# n does NOT appear in global env
cat('n in global:', exists('n', envir = globalenv()), '\n')assign() per specificare esplicitamente l'ambiente di destinazione
assign('name', value, envir = e) assegna direttamente il valore a un ambiente specifico. È più esplicito di <<- ed è utile quando si dispone di un oggetto ambiente e si desidera impostarvi precisamente un valore.
my_env <- new.env(parent = emptyenv())
assign('score', 95, envir = my_env)
assign('name', 'Alice', envir = my_env)
cat('score:', get('score', envir = my_env), '\n')
cat('name :', get('name', envir = my_env), '\n')local() — Blocchi di codice isolati
local({...}) valuta un'espressione in un nuovo ambiente locale. Le variabili create all'interno del blocco non fuoriescono nell'ambiente globale. È utile per calcoli temporanei che non devono inquinare lo spazio di lavoro.
result <- local({
temp1 <- 100
temp2 <- 200
temp1 + temp2 # the last expression is returned
})
cat('result:', result, '\n')
cat('temp1 in global:', exists('temp1'), '\n') # FALSElocal() e funzione per l'isolamento a confronto
Sia local() sia una funzione invocata immediatamente forniscono isolamento dello scope. local() è più conciso per un isolamento occasionale; una funzione con nome è preferibile quando si desidera rendere la logica riutilizzabile o testabile.
# Option A: local()
result_a <- local({
x <- 7
y <- 3
x * y
})
# Option B: immediately invoked function
result_b <- (function() {
x <- 7
y <- 3
x * y
})()
cat(result_a, result_b, '\n')
cat('x in global:', exists('x'), '\n')Lettura delle variabili globali da una funzione
Le funzioni possono leggere le variabili dal proprio scope esterno, globale o meno, senza alcuna sintassi speciale. È il normale comportamento dello scope lessicale. Tuttavia, dipendere troppo dallo stato globale rende le funzioni più difficili da testare: quando possibile, preferisca argomenti espliciti.
tax_rate <- 0.20 # global configuration
apply_tax <- function(price) {
price * (1 + tax_rate) # reads tax_rate from global
}
cat(apply_tax(100), '\n')
cat(apply_tax(250), '\n')Offuscamento delle variabili
Quando una variabile locale ha lo stesso nome di una variabile globale, l'associazione locale nasconde quella globale. All'interno della funzione viene utilizzata la versione locale. La variabile globale non viene modificata. Se avviene involontariamente, ciò può causare bug difficili da individuare.
mean <- 99 # shadows base R's mean() function
cat(mean, '\n') # prints 99, not the function
# To call the real mean, use base:: prefix
cat(base::mean(c(1, 2, 3, 4, 5)), '\n')
rm(mean) # remove the shadowAmbienti di function()
Ogni volta che viene chiamata una funzione, R crea un nuovo ambiente per quella chiamata, con l'ambiente esterno della funzione come genitore. Le variabili locali di chiamate diverse non interferiscono tra loro, nemmeno nelle chiamate ricorsive.
factorial_r <- function(n) {
# Each recursive call has its own local n
if (n <= 1) return(1)
n * factorial_r(n - 1)
}
cat('5! =', factorial_r(5), '\n')
cat('7! =', factorial_r(7), '\n')rm() per rimuovere le variabili
rm('name') o rm(name) rimuove un'associazione dall'ambiente corrente (o da quello specificato). Lo utilizzi per eliminare le variabili temporanee. Passi envir = e per rimuovere la variabile da un ambiente specifico.
x <- 42
y <- 'hello'
cat('Before rm:', ls(), '\n')
rm(x)
cat('After rm(x):', exists('x'), '\n')
rm('y')
cat('After rm(y):', exists('y'), '\n')Verifica rapida
Che cosa fa <<- che la normale assegnazione con <- non fa?
Scope: concetti chiave
Concetti chiave sullo scope globale e locale:
<-all'interno di una funzione crea una variabile locale: la variabile globale non cambia- I parametri delle funzioni sono locali; R passa gli argomenti per valore (copia alla modifica)
<<-risale la catena dei genitori e modifica la prima associazione corrispondenteassign('x', val, envir=e)per un'assegnazione esplicitamente indirizzata a un ambientelocal({...})fornisce uno scope temporaneo senza creare una funzione con nome- Eviti di nascondere nomi importanti (come
mean,c,T)
# Demonstrate local + <<- cleanly
running_sum <- 0
local({
values <- c(10, 20, 30, 40)
for (v in values) running_sum <<- running_sum + v
})
cat('Running sum:', running_sum, '\n')
cat('values in global:', exists('values'), '\n')Domande Frequenti
La lezione «Scope globale e locale» è gratuita?
Sì — il testo completo di «Scope globale e locale» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.
Cosa imparerò in «Scope globale e locale»?
Distingua tra .GlobalEnv, environment delle funzioni e closure. Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare R Academy?
Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Scope globale e locale»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione R Academy?
Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Che cos'è un environment in R?
- Regole dello scoping lessicale
- Scope globale e locale
- Creazione e analisi degli environment