有没有办法列出R中的所有环境(环境名称 [英] is there a way to list all environments (environment names) in R

查看:0
本文介绍了有没有办法列出R中的所有环境(环境名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在R学习"环境"概念。 现在我知道emptyenv()是所有环境的父项,但它没有父项,但有没有办法列出当前R会话中的所有环境或emptyenv()的子项?

推荐答案

我的解决方案是递归查找环境。我们可以这样做,因为必须在可见/已知的地方创建额外的/新的环境。尽管如此,可能还有一些次要的情况,如函数或R6类中的环境:

fun <- function() {
  ee <- new.env()
  fun2 <-  function() {
    eee <- new.env()
  }
  return(1)
}

另一件事将是抓取例如函数体的环境,在{}内。它将在函数求值期间创建,而不是在创建期间创建。这几乎是不可能的。

我要求将该对象识别为环境-is.environmentinherits(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆