一个最简单的错误,我潜入是有一个函数访问的变量,在全球环境而不是当地的环境。在开发过程中,当我更改变量的名称并忘记rm
旧的 - 然后无法更新函数以使其访问新的函数时,可能会发生这种情况。
有没有办法让R从树中的较高位置自动获取变量时返回错误或警告?这样看来,就现在R支持编译后的代码更容易....
这里是想什么,我返回一个错误/警告匆匆例如:
x <- 5
f <- function(y) {
z <- y + x
z
}
f(3) #will return 8
一个最简单的错误,我潜入是有一个函数访问的变量,在全球环境而不是当地的环境。在开发过程中,当我更改变量的名称并忘记rm
旧的 - 然后无法更新函数以使其访问新的函数时,可能会发生这种情况。
有没有办法让R从树中的较高位置自动获取变量时返回错误或警告?这样看来,就现在R支持编译后的代码更容易....
这里是想什么,我返回一个错误/警告匆匆例如:
x <- 5
f <- function(y) {
z <- y + x
z
}
f(3) #will return 8
我不认为有一个简单的方法(例如,在options()
一个选项)。您的函数是否在R脚本文件中?你在建一个包吗?
如果是这样,我认为最好的办法是:
> f <- function(y) {
+ z <- y + x
+ z
+ }
> library(codetools)
> checkUsage(f)
<anonymous>: no visible binding for global variable ‘x’ (:2)
但要注意的是,如果z
定义,那么这将找不到一个错误。您必须将您的f
函数复制到新的R会话中,然后运行checkUsage
。这看起来像一个痛苦,但它并没有那么糟糕,我相信你可以创建一些技巧来处理它。如果你的函数都在一个单独的文件中,那么这很容易。
这似乎是正确的方式,但它都要求我每次都主动调用'checkUsage',并且在例如一次性匿名函数中并不真正起作用。 sapply调用.... –
@ gsk3我不确定任何事情都可以修复一次性,但运行'checkUsage'是打包和脚本开发的好主意。 – Iterator
f()
失败,因为有不是y
的默认值。我想你的意思是f(1)
。
可能有更好的方法来做到这一点,但是您可以在开发过程中将函数定义包装在local
调用中。喜欢的东西:
x <- 5
f <- local(function(y) {
z <- y + x
z
}, baseenv())
f(1)
# Error in f(1) : object 'x' not found
糟糕。 f(1)的确是我的意思。我喜欢本地包装的想法。有没有一种方法重载'function'功能,使这并不一定为每个函数做,然后再未完成时发展“停止”(如同它曾经停止!)。 –
将函数放入包中始终是个好主意。这具有允许R CMD检查的附加优点。 R执行的其中一个检查依赖于变量(这在例如this question中被引用)。
当然,说实话,而实际开发,不断改造和检查,并重新安装你的包是有点麻烦的,所以你可能会与其他的建议更好。
请执行这些问题帮助:限制变量的作用域(http://stackoverflow.com/questions/3277556/limiting-variable-scope),[R力本地范围(http://stackoverflow.com/问题/ 6216968/R-力本地范围)? –
@JoshuaUlrich第二个是我正在寻找的。为了将所有好的答案统一在一个地方,投票结束。 –
我已经通过在干净的R会话中测试我的函数来解决这个问题。 –