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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow