将(几乎)工作区中的所有对象存储在列表中

时间:2013-09-19 14:28:33

标签: r list global workspace

假设我的工作空间(全局环境)中有很多对象,我想将大多数对象存储在列表中。这是一个简化的例子:

# Put some objects in the workspace
A <- 1
B <- 2
C <- 3

我想将对象A和C存储在列表中。当然,我可以明确地做到这一点:

mylist <- list(A,C)

但是,当工作空间中的对象数量非常大时,这将变得相当麻烦。因此,我想以不同的方式做到这一点并尝试以下方法:

mylist <- list(setdiff(ls(),B))

但这显然不是我想要的,因为它只存储工作区中对象的名称。

关于我如何做到这一点的任何建议?

非常感谢!

3 个答案:

答案 0 :(得分:12)

另一种选择是使用mget

mget(setdiff(ls(),"B"))

答案 1 :(得分:2)

编辑:我认为在这里使用lapply / sapply引发了太多问题。你绝对应该使用mget答案。

您可以尝试:

mylist <- sapply(setdiff(ls(),"B"), get)

在某些情况下,即如果工作区中的所有对象属于同一类型,sapply将返回一个向量。例如:

sapply(setdiff(ls(),"B"), get)
# A C 
# 1 3 

否则,它将返回一个列表:

v <- list(1:2)
sapply(setdiff(ls(),"B"), get)
# $A
# [1] 1
# 
# $C
# [1] 3
# 
# $v
# [1] 1 2

因此,正如Josh O'Brien指出的那样,使用lapply代替sapply可能更安全。

答案 2 :(得分:2)

在这种情况下,

mget绝对是最容易使用的。但是,您可以使用as.list.environmenteapply

实现相同目标
e2l <- as.list(.GlobalEnv)
# or: e2l <- as.list(environment()) 
# using environment() within a function returns the function's env rather than .GlobalEnv
e2l[! names(e2l) %in "B"]

# the following one sounds particularly manly with `force`
e2l <- eapply(environment(), force)
e2l[! names(e2l) %in "B"]

和单行:

 (function(x) x[!names(x)%in%"B"])(eapply(environment(), force))
 (function(x) x[!names(x)%in%"B"])(as.list(environment()))