有没有办法列出R中的所有环境(环境名称 [英] is there a way to list all environments (environment names) in R
本文介绍了有没有办法列出R中的所有环境(环境名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在R学习"环境"概念。
现在我知道emptyenv()
是所有环境的父项,但它没有父项,但有没有办法列出当前R会话中的所有环境或emptyenv()
的子项?
推荐答案
我的解决方案是递归查找环境。我们可以这样做,因为必须在可见/已知的地方创建额外的/新的环境。尽管如此,可能还有一些次要的情况,如函数或R6类中的环境:
fun <- function() {
ee <- new.env()
fun2 <- function() {
eee <- new.env()
}
return(1)
}
另一件事将是抓取例如函数体的环境,在{}内。它将在函数求值期间创建,而不是在创建期间创建。这几乎是不可能的。
我要求将该对象识别为环境-is.environment
和inherits(e, "environment")
。后一种情况保护我们不受ggproto
等加载了ggplot2
的对象的影响。
set.seed(1234)
# New environments - x7
#######################
eval(quote(ee <- new.env(parent = baseenv())))
eval(quote(ee1 <- new.env(parent = baseenv())), envir = ee)
ee2 <- new.env()
ee3 <- new.env(parent = ee2)
eval(quote(ee4 <- new.env(parent = baseenv())), envir = ee3)
eval(quote(ee5 <- new.env()), envir = baseenv())
eval(quote(ee6 <- new.env(parent = .GlobalEnv)), envir = ee3)
#######################
subenv <- function(env) {
envs <- unique(Filter(function(e) is.environment(e) && inherits(e, "environment"), lapply(ls(env), function(x) get(x, env))))
unlist(append(envs, lapply(envs, subenv)))
}
search_all = function() {
ees <- unlist(append(.GlobalEnv, rlang::env_parents(.GlobalEnv)))
unname(unlist(lapply(ees, subenv)))
}
library(ggplot2)
search_all()
结果:
> search_all()
[[1]]
<environment: 0x7f9c75e66e10>
[[2]]
<environment: 0x7f9c75e65600>
[[3]]
<environment: 0x7f9c75e68e80>
[[4]]
<environment: 0x7f9c75e65e88>
[[5]]
<environment: 0x7f9c75e67ec0>
[[6]]
<environment: 0x7f9c75e6df38>
[[7]]
<environment: 0x7f9c75e6ef30>
编辑:
此函数可用于最大化环境可见性。
new.env <- function(...) {
ee <- base::new.env(...)
if(!identical(parent.frame(), .GlobalEnv)) {
assign(paste0("env_", data.table::address(ee)), ee, envir = .GlobalEnv)
}
ee
}
不幸的是,在构建某个包时,它将默认使用base::new.env。在这里,即使assignInNamespace
也可能不能令人满意。
这篇关于有没有办法列出R中的所有环境(环境名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文