如何在r中通过变量名对环境进行子集划分

如何在r中通过变量名对环境进行子集划分,r,subset,environment,R,Subset,Environment,我想通过变量名对环境进行子集划分 e <- new.env(parent=emptyenv()) e$a <- 1 e$b <- 2 e$d <- 3 e[ls(e) %in% c("a","b", "c")] ### if e was a list, this would return the subset list(a=1, b=2) e我最初的解决方案是使用get()/mget()(可能OP在前面看到了我删除的评论)。然后我注意到OP尝试了eapply(),所以我

我想通过变量名对环境进行子集划分

e <- new.env(parent=emptyenv())
e$a <- 1
e$b <- 2
e$d <- 3
e[ls(e) %in% c("a","b", "c")]
### if e was a list, this would return the subset list(a=1, b=2)

e我最初的解决方案是使用
get()
/
mget()
(可能OP在前面看到了我删除的评论)。然后我注意到OP尝试了
eapply()
,所以我考虑了可能的解决方案。在这里(借助@thelatemail)

as.list.environment()
可以看作是
list2env()
的逆操作。它在
?列表2env
的“另请参阅”部分中提到

结果
elst
只是一个普通列表。有多种方法可以将此列表子集。例如:

elst[names(elst) %in% c("a","b")]  ## no need to use "ls(e)" now

#$a
#[1] 1 2 3

#$b
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4

好的,在仔细考虑之后,我可以建议:

mget(c("a","b"), envir=e)
#$a
#[1] 1
#
#$b
#[1] 2

[
运算符通常返回与原始对象相同类型的对象,因此我猜您需要的是一个环境,而不是列表。相同的环境但具有不同的元素集,或者具有指定元素的新环境?无论哪种方式,我想您最终都会进行迭代,例如

f = new.env(parent=emptyenv())
for (elt in c("a", "b"))
    f[[elt]] = e[[elt]]

使用环境不是非常惯用的R代码,这可能解释了为什么没有更优雅的解决方案。

您可以使用rlang::env_get_list()获取绑定列表:

rlang::env_get_list(env=e, c("a","b"))

#$a
#[1] 1
#
#$b
#[1] 2
如果您试图获取一个环境,而不是一个列表,我不确定您将如何做到这一点,而只是使用rlang::env_get_list()的输出创建一个新环境

如果要在列表中包含环境中可能不存在的元素(如“c”),则必须指定默认值,否则会出现错误:

env_get_list(env = e, c("a","b","c"))
#Error in env_get_list(env = e, c("a", "b", "c")) : argument "default" is missing, with no default

env_get_list(env = e, c("a","b","c"),default=NULL)
#$a
#[1] 1
#
#$b
#[1] 2
#
#$c
#NULL
我想你根本不想要c,所以我会做一些类似的事情:

temp <- c("a","b","c")[c("a","b","c") %in% env_names(e)]
temp
[1] "a" "b"

env_get_list(env=e,temp)
#$a
#[1] 1
#
#$b
#[1] 2

temp我认为这应该是公认的答案-可能
list2env(mget(c(“a”,“b”),envir=e),envir=f)
可能会使我的答案适应这种输出。
rlang::env_get_list(env=e, c("a","b"))

#$a
#[1] 1
#
#$b
#[1] 2
env_get_list(env = e, c("a","b","c"))
#Error in env_get_list(env = e, c("a", "b", "c")) : argument "default" is missing, with no default

env_get_list(env = e, c("a","b","c"),default=NULL)
#$a
#[1] 1
#
#$b
#[1] 2
#
#$c
#NULL
temp <- c("a","b","c")[c("a","b","c") %in% env_names(e)]
temp
[1] "a" "b"

env_get_list(env=e,temp)
#$a
#[1] 1
#
#$b
#[1] 2