2014-10-02 2 views
6

Рассмотрим следующий вложенный список, nest.Рекурсивно отправлять переменные списка в глобальную среду

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

Я хотел бы послать все индивидуальные переменные в nest для глобальной окружающей среды. То есть в списках A и B, и векторы w, x, y и z должны перейти в глобальную среду. Вот несколько моих попыток вместе с их результатами. Обратите внимание, что все они посылают только переменные в глобальную среду.

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" 

Я также пробовал другие рекурсивные возможности и получили ошибки, потому что, когда list2env попадает в нижней части списка, он приходит к выводу, что x не список.

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"))) 

Как я могу рекурсивно называть list2env так, что все переменные выходят в глобальную окружающую среду? Из свежей R сессии ls() приведет к

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

Я также экспериментировал с local, и я с той же проблемой.

+0

Я думал, что сговор будет идти. Я не могу заставить его работать – rawr

ответ

7

Используйте рекурсивную функцию. Не изящно, но, похоже, он работает:

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"