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.
Pensavo che il rapply sarebbe stato il migliore. Nemmeno io riesco a farlo funzionare – rawr