8

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

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

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

mylist <- list(A,C)

但是,当工作空间中的对象数量很大时,这会变得相当麻烦。因此,我想以不同的方式执行此操作并尝试以下操作:

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

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

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

非常感谢!

4

3 回答 3

14

另一种选择是使用mget

mget(setdiff(ls(),"B"))
于 2013-09-19T14:34:15.317 回答
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

于 2013-09-19T14:31:01.950 回答
2

mget在这种情况下绝对是最容易使用的。但是,您可以使用as.list.environmentand实现相同的目的eapply

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()))
于 2013-09-19T19:19:35.627 回答