R Language
Variabelns omfattning
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.