Gli environment in R
1
Oggetti di classe list, data.frame e environment.
2
> y <- list(a=1, 5, b=4:5, c = "a")
> y
$a
[1] 1
[[2]]
[1] 5
$b
[1] 4 5
$c
[1] "a"
> y[[1]]
[1] 1
> y[["c"]]
[1] "a"
> y$a
[1] 1
>str(y)
3
> data(iris)
> str(iris)
‘data.frame’: 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
> iris$Species
> iris[["Species"]]
> iris[[5]]
> iris[,5]
4
> rm(list=ls())
> e1 <- new.env()
> e1$a <- 10
> e1$a
[1] 10
> ls()
[1] "e1"
> ls(e1)
[1] "a"
> assign("b", 3, env=e1)
> ls()
[1] "e1"
> ls(e1)
[1] "a" "b"
5
Gli environment sono molto utili quando si vogliono eseguire procedure in uno spazio di memoria che non interferisce con l’attuale workspace di R (.GlobalEnv) o di qualche altro pacchetto
> a+b
Errore: oggetto "a" non trovato
> eval(a+b)
Errore in eval(a + b) : oggetto "a" non trovato
> eval(expression(a+b),envir=e1)
[1] 13
> e1
<environment: 0x1c8df40>
> str(e1)
length 2 <environment>
> .GlobalEnv
<environment: R_GlobalEnv>
> str(.GlobalEnv)
length 7 <environment>
6
Nell’esempio che segue creiamo un oggetto x nel .GlobalEnv e ne creiamo un altro in e1
> x <- 4
> assign("x", get("a",e1)+get("b",e1), e1)
> ls(e1)
[1] "a" "b" "x"
> e1$x
[1] 13
> x
[1] 4
7
Possiamo inoltre specificare l’environment di riferimento per le funzioni
> myf <- function(u) u+a
> myf
function(u) u+a
> myf(5)
Errore in myf(5) : oggetto "a" non trovato
> environment(myf) <- e1
> myf
function(u) u+a
<environment: 0x1c8df40>
> myf(5)
[1] 15
8
Guardare con attenzione il seguente codice:
> rm(list=ls())
> e1 <- new.env()
> e1$a <- 10
> foo <- function(x) x+a
> environment(foo) <- e1
> foo(4)
[1] 14
> e1$a <- 20
> foo(4)
[1] 24
> rm(e1)
> foo(4)
[1] 24
> foo(5)
[1] 25
perché dopo aver rimosso e1 dal .GlobalEnv la funzione foo trova ancora a?
9
Perché la funzione rm rimuove solo i nomi dal workspace ma non gli oggetti se questi sono legati ad altri oggetti. Infatti, la funzione rm non necessariamente produce un aumento della memoria disponibile
> environment(foo)
<environment: 0x1fe5e38>
> ls(environment(foo))
[1] "a"
> environment(foo)$a
[1] 20
> e1 <- environment(foo)
> e1
<environment: 0x1fe5e38>
10