R Language
Zakres zmiennych
Szukaj…
Uwagi
Najczęstszy pułap z zasięgiem powstaje w procesie równoległości. Wszystkie zmienne i funkcje muszą zostać przekazane do nowego środowiska, które jest uruchamiane w każdym wątku.
Środowiska i funkcje
Zmienne zadeklarowane w funkcji istnieją tylko (o ile nie zostały przekazane) wewnątrz tej funkcji.
x <- 1
foo <- function(x) {
y <- 3
z <- x + y
return(z)
}
y
Błąd: nie znaleziono obiektu „y”
Zmienne przekazane do funkcji, a następnie ponownie przypisane, są nadpisywane, ale tylko wewnątrz funkcji .
foo <- function(x) {
x <- 2
y <- 3
z <- x + y
return(z)
}
foo(1)
x
5
1
Zmienne przypisane w środowisku wyższym niż funkcja istnieją w tej funkcji, bez przekazywania.
foo <- function() {
y <- 3
z <- x + y
return(z)
}
foo()
4
Funkcje podrzędne
Funkcje wywoływane w ramach funkcji (tj. Podfunkcje) muszą być zdefiniowane w tej funkcji, aby uzyskać dostęp do dowolnych zmiennych zdefiniowanych w środowisku lokalnym bez przekazywania.
To się nie udaje:
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <- 3
z <- bar()
return(z)
}
foo()
Błąd w bar (): nie znaleziono obiektu „y”
To działa:
foo <- function() {
bar <- function() {
z <- x + y
return(z)
}
y <- 3
z <- bar()
return(z)
}
foo()
4
Przydział globalny
Zmienne można przypisywać globalnie z dowolnego środowiska za pomocą <<-
. bar()
może teraz uzyskać dostęp do y
.
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <<- 3
z <- bar()
return(z)
}
foo()
4
Globalne przydzielanie jest wysoce odradzane. Zdecydowanie preferowane jest użycie funkcji otoki lub jawne wywoływanie zmiennych z innego środowiska lokalnego.
Jawne przypisanie środowisk i zmiennych
Środowiska w R można jawnie wywoływać i nazywać. Zmienne mogą być jawnie przypisywane i wywoływane do lub z tych środowisk.
Powszechnie tworzone środowisko to takie, które obejmuje package:base
lub podśrodowisko w package:base
.
e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)
Zmienne mogą być jawnie przypisywane i wywoływane do lub z tych środowisk.
assign("a", 3, envir = e1)
get("a", envir = e1)
get("a", envir = e2)
3)
3)
Ponieważ e2
dziedziczy po e1
, a
wynosi 3
zarówno w e1
jak i e2
. Jednak przypisywanie ciągu a
e2
nie zmienia wartości w a
e1
.
assign("a", 2, envir = e2)
get("a", envir = e2)
get("a", envir = e1)
3)
2)
Wyjście z funkcji
Funkcja on.exit()
jest przydatna przy czyszczeniu zmiennych, jeśli trzeba przypisać zmienne globalne.
Niektóre parametry, szczególnie te dotyczące grafiki, można ustawić tylko globalnie. Ta niewielka funkcja jest powszechna podczas tworzenia bardziej specjalistycznych wykresów.
new_plot <- function(...) {
old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
on.exit(par(old_pars))
plot(...)
}
Pakiety i maskowanie
Funkcje i obiekty w różnych pakietach mogą mieć tę samą nazwę. Paczka załadowana później „zamaskuje” wcześniejszą paczkę i zostanie wydrukowany komunikat ostrzegawczy. Podczas wywoływania funkcji według nazwy uruchomiona zostanie funkcja z ostatnio załadowanego pakietu. Do wcześniejszej funkcji można uzyskać bezpośredni dostęp.
library(plyr)
library(dplyr)
Dołączanie pakietu: „dplyr”
Następujące obiekty są maskowane z „pakietu: plyr”:
ułóż, policz, desc, failwith, id, mutate, zmień nazwę, podsumuj, podsumuj
Następujące obiekty są maskowane z „pakietu: statystyki”:
filtr, opóźnienie
Następujące obiekty są maskowane z „package: base”:
przecinać, setdiff, setequal, union
Podczas pisania kodu najlepszą praktyką jest zawsze jawne wywoływanie funkcji za pomocą package::function()
aby uniknąć tego problemu.