2011-11-16 45 views
3

可能重复:
Limiting variable scope使R返回一个错误,用于访问全球

一个最简单的错误,我潜入是有一个函数访问的变量,在全球环境而不是当地的环境。在开发过程中,当我更改变量的名称并忘记rm旧的 - 然后无法更新函数以使其访问新的函数时,可能会发生这种情况。

有没有办法让R从树中的较高位置自动获取变量时返回错误或警告?这样看来,就现在R支持编译后的代码更容易....

这里是想什么,我返回一个错误/警告匆匆例如:

x <- 5 
f <- function(y) { 
    z <- y + x 
    z 
} 
f(3) #will return 8 
+1

请执行这些问题帮助:限制变量的作用域(http://stackoverflow.com/questions/3277556/limiting-variable-scope),[R力本地范围(http://stackoverflow.com/问题/ 6216968/R-力本地范围)? –

+0

@JoshuaUlrich第二个是我正在寻找的。为了将所有好的答案统一在一个地方,投票结束。 –

+0

我已经通过在干净的R会话中测试我的函数来解决这个问题。 –

回答

2

我不认为有一个简单的方法(例如,在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。这看起来像一个痛苦,但它并没有那么糟糕,我相信你可以创建一些技巧来处理它。如果你的函数都在一个单独的文件中,那么这很容易。

+0

这似乎是正确的方式,但它都要求我每次都主动调用'checkUsage',并且在例如一次性匿名函数中并不真正起作用。 sapply调用.... –

+0

@ gsk3我不确定任何事情都可以修复一次性,但运行'checkUsage'是打包和脚本开发的好主意。 – Iterator

1

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 
+0

糟糕。 f(1)的确是我的意思。我喜欢本地包装的想法。有没有一种方法重载'function'功能,使这并不一定为每个函数做,然后再未完成时发展“停止”(如同它曾经停止!)。 –

1

将函数放入包中始终是个好主意。这具有允许R CMD检查的附加优点。 R执行的其中一个检查依赖于变量(这在例如this question中被引用)。

当然,说实话,而实际开发,不断改造和检查,并重新安装你的包是有点麻烦的,所以你可能会与其他的建议更好。