我正在编写一个新的R包,并发现我没有显式传递给包中的函数的变量(作为输入参数)在其中可见,例如:
myFunc <- function(a,b,c) {
print(d)
}
其中d
位于调用者.R
脚本中,但尚未传递给myFunc
,可见。
任何帮助都会很棒,谢谢;我使用的是R 3.2.4并且一直在使用roxygen2
(通过devtools::document()
)来创建NAMESPACE
,如果有帮助的话。
答案 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
的内容以删除无意中使用的全局变量。