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