从R

时间:2015-05-17 04:32:54

标签: r list packing

我有两个与在R中使用list相关的问题,我试图看看如何改进我天真的解决方案。我在这里看到similar topic的问题,但那里描述的方法没有帮助。

Q1:

MWE:

a  <- c(1:5)
b  <- "adf"
c  <- array(rnorm(9), dim = c(3,3) )
  • 制作一个列表,用名称&#34; packedList&#34;,同时保留名称 所有变量。
  • 当前解决方案:packedList <- list(a = a, b = b, c = c)

但是,如果变量的数量(上面的三个问题,即a, b, c)是    大(说我们有20个变量),那么我目前的解决方案可能不是    最好的。

这个想法在从中返回大量变量时很有用    一个功能。

Q2:

MWE:给定packedList,提取变量a,b,c

  • 我想将给定列表中的所有元素(即packedList)提取到环境中,同时保留它们的名称。这与任务1相反。

例如:给定环境中的变量packedList,我可以按如下方式定义a,b和c:

 a <- packedList$a
 b <- packedList$b
 c <- packedList$c

但是,如果变量的数量非常大,那么我的解决方案可能很麻烦。 - 经过一些谷歌搜索后,我找到one solution,但我不确定它是否也是最优雅的解决方案。解决方案如下所示:

 x <- packedList
 for(i in 1:length(x)){
       tempobj <- x[[i]]
       eval(parse(text=paste(names(x)[[i]],"= tempobj")))
 }

1 个答案:

答案 0 :(得分:7)

您最有可能寻找mget(Q1)和list2env(Q2)。

这是一个小例子:

ls()  ## Starting with an empty workspace
# character(0)

## Create a few objects
a  <- c(1:5)
b  <- "adf"
c  <- array(rnorm(9), dim = c(3,3))

ls()  ## Three objects in your workspace
[1] "a" "b" "c"

## Pack them all into a list
mylist <- mget(ls())
mylist
# $a
# [1] 1 2 3 4 5
# 
# $b
# [1] "adf"
# 
# $c
#             [,1]       [,2]       [,3]
# [1,]  0.70647167  1.8662505  1.7941111
# [2,] -1.09570748  0.9505585  1.5194187
# [3,] -0.05225881 -1.4765127 -0.6091142

## Remove the original objects, keeping just the packed list   
rm(a, b, c)

ls()  ## only one object is there now
# [1] "mylist"

## Use `list2env` to recreate the objects
list2env(mylist, .GlobalEnv)
# <environment: R_GlobalEnv>
ls()  ## The list and the other objects...
# [1] "a"      "b"      "c"      "mylist"