Zakres globalny a lokalny
Poznaj różnice między .GlobalEnv, środowiskami funkcji i domknięciami.
Zakres globalny a lokalny to bezpłatna lekcja R Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Zmienne lokalne w funkcjach
Zmienne przypisywane za pomocą <- lub = wewnątrz ciała funkcji są lokalne dla tej funkcji. Są tworzone we własnym środowisku funkcji i znikają po jej zakończeniu. Nigdy nie wpływają na zakres wywołujący.
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'Parametry funkcji są lokalne
Parametry funkcji również są zmiennymi lokalnymi. Modyfikacja parametru wewnątrz funkcji nie wpływa na argument w środowisku wywołującym. R przekazuje argumenty przez wartość (z kopiowaniem przy modyfikacji).
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<<- do przypisywania globalnego
<<- (przypisanie nadzorne) przeszukuje łańcuch środowisk nadrzędnych i przypisuje wartość pierwszemu znalezionemu dopasowaniu. Jeśli nigdzie nie ma dopasowania, tworzy powiązanie w środowisku globalnym. Używaj tego oszczędnie — nadmierne stosowanie <<- utrudnia zrozumienie działania funkcji.
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')<<- przeszukuje łańcuch w górę
<<- nie przypisuje bezpośrednio do środowiska globalnego — przechodzi w górę łańcucha środowisk nadrzędnych i przypisuje wartość pierwszemu środowisku, w którym dana nazwa już istnieje. Jeśli zmienna istnieje w otaczającej funkcji, zostanie zaktualizowana właśnie tam.
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() do jawnego wskazywania środowiska docelowego
assign('name', value, envir = e) przypisuje wartość bezpośrednio do określonego środowiska. Jest bardziej jednoznaczne niż <<- i przydaje się, gdy mają Państwo obiekt środowiska i chcą precyzyjnie ustawić w nim wartość.
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() — izolowane bloki kodu
local({...}) oblicza wyrażenie w nowym, lokalnym środowisku. Zmienne utworzone wewnątrz bloku nie przedostają się do środowiska globalnego. Jest to przydatne przy tymczasowych obliczeniach, które nie powinny zaśmiecać obszaru roboczego.
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() a funkcja do izolacji
Zarówno local(), jak i funkcja wywoływana natychmiast zapewniają izolację zakresu. local() jest zwięźlejsze w przypadku jednorazowej izolacji, natomiast nazwana funkcja sprawdza się lepiej, gdy logika ma być wielokrotnie używana lub testowana.
# 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')Odczytywanie zmiennych globalnych z funkcji
Funkcje mogą odczytywać zmienne ze swojego zakresu otaczającego (globalnego lub innego) bez specjalnej składni. Jest to standardowe działanie zakresu leksykalnego. Jednak silne uzależnienie od stanu globalnego utrudnia testowanie funkcji — jeśli to możliwe, należy preferować jawne argumenty.
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')Przesłanianie zmiennych
Gdy zmienna lokalna ma taką samą nazwę jak zmienna globalna, lokalne powiązanie przesłania globalne. Wewnątrz funkcji używana jest wersja lokalna. Zmienna globalna pozostaje nienaruszona. Jeśli stanie się to nieumyślnie, może prowadzić do trudnych do wykrycia błędów.
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 shadowŚrodowiska function()
Za każdym razem, gdy funkcja jest wywoływana, R tworzy nowe środowisko dla tego wywołania, a środowisko otaczające funkcji ustawia jako jego rodzica. Zmienne lokalne z różnych wywołań nie wpływają na siebie, nawet w przypadku wywołań rekurencyjnych.
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() do usuwania zmiennych
rm('name') lub rm(name) usuwa powiązanie z bieżącego (lub określonego) środowiska. Użyj tej funkcji do usuwania tymczasowych zmiennych. Przekaż envir = e, aby usunąć zmienną z konkretnego środowiska.
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')Szybkie sprawdzenie
Co robi <<-, czego nie robi zwykłe <-?
Zakres: najważniejsze informacje
Najważniejsze informacje o zakresie globalnym i lokalnym:
<-wewnątrz funkcji tworzy zmienną lokalną — zmienna globalna pozostaje bez zmian- Parametry funkcji są lokalne; R przekazuje argumenty przez wartość (kopiowanie przy modyfikacji)
<<-przechodzi w górę łańcucha środowisk nadrzędnych i modyfikuje pierwsze pasujące powiązanieassign('x', val, envir=e)służy do jawnego przypisywania wartości w określonym środowiskulocal({...})zapewnia tymczasowy zakres bez tworzenia nazwanej funkcji- Należy unikać przesłaniania ważnych nazw (takich jak
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')Często zadawane pytania
Czy lekcja „Zakres globalny a lokalny” jest bezpłatna?
Tak — pełny tekst „Zakres globalny a lokalny” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Zakres globalny a lokalny”?
Poznaj różnice między .GlobalEnv, środowiskami funkcji i domknięciami. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Zakres globalny a lokalny”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czym jest środowisko w R?
- Reguły zakresu leksykalnego
- Zakres globalny a lokalny
- Tworzenie i analizowanie środowisk