使R返回访问全局文件的错误

使R返回访问全局文件的错误,r,scope,R,Scope,可能重复: 对我来说,最容易犯的错误之一是让函数访问全局环境中的变量,而不是本地环境中的变量。在开发过程中,如果我更改了变量的名称,忘记了rm旧的变量,然后无法更新函数以使其访问新的变量,则可能会发生这种情况 有没有一种方法可以让R在自动从树的更高层抓取变量时返回错误或警告?既然R支持编译代码,这似乎就容易多了 下面是一个我想返回错误/警告的快速示例: x <- 5 f <- function(y) { z <- y + x z } f(3) #will ret

可能重复:

对我来说,最容易犯的错误之一是让函数访问全局环境中的变量,而不是本地环境中的变量。在开发过程中,如果我更改了变量的名称,忘记了
rm
旧的变量,然后无法更新函数以使其访问新的变量,则可能会发生这种情况

有没有一种方法可以让R在自动从树的更高层抓取变量时返回错误或警告?既然R支持编译代码,这似乎就容易多了

下面是一个我想返回错误/警告的快速示例:

x <- 5
f <- function(y) {
   z <- y + x
   z
}
f(3)  #will return 8
x
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

x我认为没有简单的方法(例如
options()
中的选项)。您的函数是否在R脚本文件中?您正在构建一个包吗

如果是这样,我认为最好的办法是:

> f <- function(y) {
+    z <- y + x
+    z
+ }
> library(codetools)
> checkUsage(f)
<anonymous>: no visible binding for global variable ‘x’ (:2)
>f检查用法(f)
:全局变量“x”没有可见绑定(:2)

但请注意,如果定义了
z
,则不会发现错误。您必须将
f
函数复制到新的R会话中,然后运行
checkUsage
。这似乎是一种痛苦,但它不是那么糟糕,我相信你可以创造一些技巧来处理它。如果您的函数都在一个单独的文件中,那么就很容易了。

将函数放入一个包中总是一个好主意。这还具有允许R CMD检查的额外优势。R执行的检查之一是对变量的依赖性(这在例如中引用)


当然,说实话,在实际开发过程中,不断地重建、检查和重新安装您的软件包有点麻烦,因此您最好使用其他建议。

以下问题中的任何一个是否有帮助:,?@JoshuaUlrich第二个问题就是我要找的问题。为了将所有好的答案集中在一个地方,我投票决定关闭。我通过在clean R sessions.Oops中测试我的函数来解决这个问题。f(1)确实是我的意思。我喜欢本地包装的想法。是否有一种方法可以重载
函数
函数,这样就不必对每个函数都执行此操作,然后在开发“停止”(好像它曾经停止过!)时再次取消此操作。这似乎是正确的方法,但每次都需要我主动调用
检查用法
,在sapply调用中,一次性匿名函数实际上不起作用。…@gsk3我不确定是否有任何东西可以解决一次性问题,但是运行
checkUsage
对于包和脚本开发是一个好主意。