2014-10-02 8 views
6

Considerare il seguente elenco annidato, nest.Inviare in modo ricorsivo variabili di lista all'ambiente globale

nest <- list(
    A = list(w = 1:5, x = letters[1:5]), 
    B = list(y = 6:10, z = LETTERS[1:5]) 
) 

mi piacerebbe trasmettere tutte le singole variabili nel nest per l'ambiente globale. Cioè, gli elenchi A e B ei vettori w, x, e z dovrebbero tutti andare all'ambiente globale. Ecco alcune delle mie prove insieme ai loro risultati. Si noti che tutti questi inviano solo alcune delle delle variabili all'ambiente globale.

list2env(nest, .GlobalEnv) 
ls() 
# [1] "A" "B" "nest" 
list2env(unlist(nest, recursive = FALSE), .GlobalEnv) 
ls() 
# [1] "A.w" "A.x" "B.y" "B.z" "nest" 
lapply(nest, list2env, envir = .GlobalEnv) 
ls() 
# [1] "nest" "w" "x" "y" "z" 
with(nest, list2env(mget(ls()), .GlobalEnv)) 
ls() 
# [1] "A" "B" "nest" 

Ho provato anche altre possibilità ricorsive e ottenuto gli errori perché quando list2env colpisce il fondo della lista, si trova che x non è un elenco.

rapply(nest, list2env, envir = .GlobalEnv) 
# Error in (function (x, envir = NULL, parent = parent.frame(), 
# hash = (length(x) > : first argument must be a named list 
with(nest, { 
    obj <- mget(ls()) 
    do.call(list2env, c(obj, envir = .GlobalEnv)) 
}) 
# Error in (function (x, envir = NULL, parent = parent.frame(), 
#  hash = (length(x) > : unused arguments (A = list(w = 1:5, 
#  x = c("a", "b", "c", "d", "e")), B = list(y = 6:10, 
#  z = c("A", "B", "C", "D", "E"))) 

Come posso ricorsivamente chiamare list2env in modo che tutte le variabili vanno al contesto globale? Da una sessione di R fresca, ls() si tradurrebbe in

# [1] "A" "B" "nest" "w" "x" "y" "z" 

Ho anche sperimentato con local e sto avendo lo stesso problema.

+0

Pensavo che il rapply sarebbe stato il migliore. Nemmeno io riesco a farlo funzionare – rawr

risposta

7

Utilizzare una funzione ricorsiva. Non elegante ma sembra funzionare:

nest <- list(A = list(w = 1:5, x = letters[1:5]), 
      B = list(y = 6:10, z = LETTERS[1:5])) 

test <- function(x) { 
    if(is.list(x)) { 
     list2env(x, envir = .GlobalEnv) 
     lapply(x, test) 
    } 
} 

test(nest) 
ls() 
# [1] "A" "B" "nest" "test" "w" "x" "y" "z" 
Problemi correlati