R包可以看到未传递给它的变量

时间:2016-03-22 13:49:38

标签: r

我正在编写一个新的R包,并发现我没有显式传递给包中​​的函数的变量(作为输入参数)在其中可见,例如:

myFunc <- function(a,b,c) {
  print(d)
}

其中d位于调用者.R脚本中,但尚未传递给myFunc,可见。

任何帮助都会很棒,谢谢;我使用的是R 3.2.4并且一直在使用roxygen2(通过devtools::document())来创建NAMESPACE,如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

这不仅仅是R?

中范围规则的结果

您的函数定义了一个新的myFunc环境。当您尝试在d中引用print(d)时,解释器首先在myFunc环境中检查名为d的对象。因为不存在这样的对象,所以解释器接下来在调用环境中检查名为d的对象。它找到.R脚本中定义的变量,然后将其打印出来。

这里有a link,其中包含更多信息和一堆示例。

答案 1 :(得分:0)

非常有用的链接,谢谢。看起来强制函数内的有限范围(即,使函数不访问全局范围)不是R的默认属性。

我在这里找到了类似的问题:R force local scope

使用主响应者发布的checkStrict函数来解决这个问题似乎已经奏效了;它发现了一个全局变量的无意使用。

> require(myCustomPackage)
> checkStrict(showDendro)
Warning message:
In checkStrict(showDendro) : global variables used: palName

其中showDendro是我的自定义包中的函数。

所以我的问题的解决方案似乎是:

1)虽然您可以通过将所有函数包含在local()函数中来阻止R向上移动到全局环境,但这似乎是一个单调乏味的解决方案。

2)将代码从一般环境移动到自己的函数中时,运行类似checkStrict的内容以删除无意中使用的全局变量。