【问题标题】:How to use R environments inside package?如何在包内使用 R 环境?
【发布时间】:2021-04-21 10:08:50
【问题描述】:

我遇到了一个问题,使用 with() 似乎找不到变量

我有一个包,其内部数据是一个环境 (ENV);所以我的包中的每个函数都可以访问(和修改)ENV。

基本上我在我的包中使用以下代码:

/data-raw我做一个环境,保存到/data

ENV = new.env()
ENV$A = 2
ENV$B = 3

在我的包裹里:

foo<-function(bar){
  with(ENV,{
    if(nrow(bar)==0){
      print(ENV$A)
    } else {
      print(ENV$B)
    }
  })
}

bar = data.frame()
foo(bar)

我实际得到的是:Error in nrow(bar) { : object '.result' not found

我以为函数环境是with 环境的父级...我不能像这样访问函数的变量吗?

感谢您的帮助。

更新

所以,他们肯定在不同的地方。函数内部的父环境是我的包命名空间,而with 内部的父环境是全局环境。

【问题讨论】:

  • 当然,with 外部包也有同样的问题。重要的是是否可以从ENV 的父环境中找到bar
  • 另一件事:R CMD Check 可能会抱怨在包内使用with,因为它无法验证环境中的名称是否存在。你会收到关于未声明的全局标识符的丑陋警告。确实,最好的解决方案是不要在包代码中使用with 及其同类。
  • 谢谢,这真的很有帮助。我将用 ENV$A 替换 with。我只使用with,因为它似乎使代码更清晰。

标签: r


【解决方案1】:

我认为函数环境将是 with 环境的父级...

否:with 的父环境是环境的父环境。事实上,这是 with 这样的命令所存在的基本问题之一。

要解决此问题,您可以将环境转换为列表(通过as.list)。当然,复制环境中的所有对象,因此它可能效率低下。它还使得修改环境中的对象变得不可能。

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多