如何通过r中的变量名来对环境进行子集化

时间:2016-07-07 00:14:03

标签: 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)

我无法弄清楚如何按名称对环境元素进行子集化。使用lapply或eapply也不起作用。通过变量名称对环境进行子集的正确或简单方法是什么? 谢谢。

5 个答案:

答案 0 :(得分:5)

好的,经过多思考后,我可以建议:

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

答案 1 :(得分:3)

我原来的解决方案是使用get() / mget()(也许OP早先看到我删除的评论)。然后我注意到OP尝试了eapply(),所以我想到了可能的解决方案。这是(在@thelatemail的帮助下)。

# try some different data type
e <- new.env(parent=emptyenv())
e$a <- 1:3
e$b <- matrix(1:4, 2)
e$c <- data.frame(x=letters[1:2],y=LETTERS[1:2])

您可以使用以下任一方法将环境e中的对象收集到列表中:

elst <- eapply(e, "[")  ## my idea
elst <- eapply(e, identity)  ## thanks to @thelatemail
elst <- as.list.environment(e)  ## thanks to @thelatemail

#$a
#[1] 1 2 3

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

#$c
#  x y
#1 a A
#2 b B

可以将as.list.environment()视为list2env()的反向操作。在?list2env的“另请参阅”部分中提到了它。

结果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

答案 2 :(得分:2)

mget(ls(e)[ls(e) %in% c('a','b','d')], e)

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

您可以使用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