Sök…


Anmärkningar

Den vanligaste fallgropen med omfattning uppstår vid parallellisering. Alla variabler och funktioner måste överföras till en ny miljö som körs på varje tråd.

Miljöer och funktioner

Variabler som deklarerats inuti en funktion finns endast (om inte godkänd) inuti den funktionen.

x <- 1

foo <- function(x) {
    y <- 3
    z <- x + y
    return(z)
}

y

Fel: objektet 'y' hittades inte

Variabler som skickas in i en funktion och sedan tilldelas om skrivs över, men bara inuti funktionen .

foo <- function(x) {
    x <- 2
    y <- 3
    z <- x + y
    return(z)
}

foo(1)
x

5

1

Variabler som tilldelas i en högre miljö än en funktion finns inom den funktionen utan att ha godkänts.

foo <- function() {
    y <- 3
    z <- x + y
    return(z)
}
    
foo()

4

Underfunktioner

Funktioner som anropas inom en funktion (dvs subfunktioner) måste definieras inom den funktionen för att komma åt alla variabler som definieras i den lokala miljön utan att ha passerat.

Detta misslyckas:

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <- 3
    z <- bar()
    return(z)
}

foo()

Fel i fält (): objektet 'y' hittades inte

Det här fungerar:

foo <- function() {
    
    bar <- function() {
        z <- x + y
        return(z)
    }
    
    y <- 3
    z <- bar()
    return(z)
}
    
foo()

4

Global uppdrag

Variabler kan tilldelas globalt från alla miljöer med hjälp av <<- . bar() kan nu komma åt y .

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <<- 3
    z <- bar()
    return(z)
}

foo()

4

Global uppdrag är starkt avskräckt. Användning av en omslagsfunktion eller uttryckligen anropande variabler från en annan lokal miljö föredras starkt.

Explicit tilldelning av miljöer och variabler

Miljöer i R kan uttryckligen anropas och namnges. Variabler kan uttryckligen tilldelas och ringa till eller från dessa miljöer.

En vanligt skapad miljö är en som omsluter package:base eller en submiljö inom package:base .

e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)

Variabler kan uttryckligen tilldelas och ringa till eller från dessa miljöer.

assign("a", 3, envir = e1)
   get("a", envir = e1)
   get("a", envir = e2)

3

3

Sedan e2 ärver från e1 , a är 3 i både e1 och e2 . Att tilldela a inom e2 ändrar dock inte värdet på a i e1 .

assign("a", 2, envir = e2)
   get("a", envir = e2)
   get("a", envir = e1)

3

2

Funktionsutgång

on.exit() är praktisk för variabel rensning om globala variabler måste tilldelas.

Vissa parametrar, särskilt de för grafik, kan bara ställas in globalt. Denna lilla funktion är vanlig när du skapar mer specialiserade tomter.

new_plot <- function(...) {
     
     old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
     on.exit(par(old_pars))
     plot(...)
 }

Paket och maskering

Funktioner och objekt i olika paket kan ha samma namn. Paketet som laddas senare "maskerar" det tidigare paketet och ett varningsmeddelande skrivs ut. När du ringer funktionen med namn körs funktionen från det senast laddade paketet. Den tidigare funktionen kan nås uttryckligen.

library(plyr)
library(dplyr)

Bifogande paket: 'dplyr'

Följande objekt maskeras från 'paket: plyr':

ordna, räkna, desc, failwith, id, mutera, byta namn, sammanfatta, sammanfatta

Följande objekt maskeras från 'paket: statistik':

filter, lag

Följande objekt maskeras från 'paket: bas':

korsar, setdiff, setequal, union

När du skriver kod är det alltid bästa praxis att anropa funktioner uttryckligen med package::function() specifikt för att undvika problemet.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow