R Language
Scope van variabelen
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.