在R中,将列表中的元素打包和解包

12

我有两个关于在R中使用列表的问题,我正在尝试看看如何改进我的初学者解决方案。我在此处看到了类似主题的问题,但那里描述的方法并没有帮助。

问题1:

MWE:

a  <- c(1:5)
b  <- "adf"
c  <- array(rnorm(9), dim = c(3,3) )
  • 创建一个名为“packedList”的列表,同时保留所有变量的名称。
  • 当前解决方案:packedList <- list(a = a, b = b, c = c)

然而,如果变量数量很大(比如有20个变量),那么我的当前解决方案可能不是最好的。

这种思想在从函数返回大量变量时很有用。

Q2:

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

  • 我想要在保留它们的名称的同时,将给定列表中的所有元素提取到环境中。这是任务1的反向操作。

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

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

然而,如果变量的数量非常大,则我的解决方案可能会很繁琐。通过一些谷歌搜索,我找到了一个方法,但我不确定它是否是最优雅的解决方案。以下是该解决方案:

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

你可以在 R 语言中使用 zeallot 包进行解包。 library(zeallot) c(a,b,c) %<-% c(1,2,3)
a [1] 1 b [1] 2 c [1] 3
- Dr Nisha Arora
1个回答

12

你很可能正在寻找 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"

感谢您的回答。在环境中有四个变量(比如a、b、c、d),但我们只想为三个变量(a、b、c)创建一个列表的情况下,mget(ls())将无法工作。您有什么想法可以解决这个问题吗? - skaur
1
@skaur,只需提供您想要的值的字符向量:mget(c("a", "b", "c")) - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接