Zoeken…


Opmerkingen

De meest voorkomende valkuil met reikwijdte ontstaat in parallellisatie. Alle variabelen en functies moeten worden doorgegeven aan een nieuwe omgeving die op elke thread wordt uitgevoerd.

Omgevingen en functies

Variabelen die binnen een functie worden gedeclareerd, bestaan alleen (tenzij doorgegeven) binnen die functie.

x <- 1

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

y

Fout: object 'y' niet gevonden

Variabelen die in een functie worden doorgegeven en vervolgens opnieuw worden toegewezen, worden overschreven, maar alleen binnen de functie .

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

foo(1)
x

5

1

Variabelen toegewezen in een hogere omgeving dan een functie bestaan binnen die functie, zonder te worden doorgegeven.

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

4

Sub-functies

Functies die worden aangeroepen binnen een functie (dat wil zeggen subfuncties) moeten binnen die functie worden gedefinieerd om toegang te krijgen tot alle variabelen die in de lokale omgeving zijn gedefinieerd zonder te worden doorgegeven.

Dit faalt:

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

foo()

Fout in bar (): object 'y' niet gevonden

Dit werkt:

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

4

Wereldwijde opdracht

Variabelen kunnen vanuit elke omgeving globaal worden toegewezen met behulp van <<- . bar() heeft nu toegang tot y .

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

foo()

4

Wereldwijde opdracht wordt ten zeerste afgeraden. Het gebruik van een wrapper-functie of het expliciet oproepen van variabelen uit een andere lokale omgeving heeft sterk de voorkeur.

Expliciete toewijzing van omgevingen en variabelen

Omgevingen in R kunnen expliciet worden genoemd en benoemd. Variabelen kunnen expliciet worden toegewezen en naar of vanuit die omgevingen worden opgeroepen.

Een algemeen gecreëerde omgeving is er een die package:base of een subomgeving binnen package:base omsluit.

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

Variabelen kunnen expliciet worden toegewezen en naar of vanuit die omgevingen worden opgeroepen.

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

3

3

Omdat e2 van e1 erft, is a 3 in zowel e1 als e2 . Het toewijzen van a binnen e2 verandert echter niet de waarde van a in e1 .

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

3

2

Functie Exit

De functie on.exit() is handig voor het opschonen van variabelen als globale variabelen moeten worden toegewezen.

Sommige parameters, met name die voor grafische afbeeldingen, kunnen alleen globaal worden ingesteld. Deze kleine functie is gebruikelijk bij het maken van meer gespecialiseerde plots.

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

Pakketten en maskeren

Functies en objecten in verschillende pakketten kunnen dezelfde naam hebben. Het pakket dat later wordt geladen, maskeert het eerdere pakket en er wordt een waarschuwingsbericht afgedrukt. Wanneer u de functie op naam aanroept, wordt de functie van het laatst geladen pakket uitgevoerd. De eerdere functie is expliciet toegankelijk.

library(plyr)
library(dplyr)

Bevestigingspakket: 'dplyr'

De volgende objecten worden gemaskeerd vanuit 'pakket: plyr':

rangschikken, tellen, aflopen, failwith, id, muteren, hernoemen, samenvatten, samenvatten

De volgende objecten worden gemaskeerd vanuit 'pakket: statistieken':

filter, vertraging

De volgende objecten worden gemaskeerd vanuit 'package: base':

snijden, setdiff, setequal, union

Bij het schrijven van code is het altijd het beste om functies expliciet aan te roepen met behulp van package::function() om dit probleem te voorkomen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow