我刚刚在我写过的一些R代码中找到了一个愚蠢的错误。这个错误等同于:
brokenEarlyReturn = function(x=TRUE) {
if (x) return # broken with bare return
stop("Should not get here if x is TRUE. x == ", x)
}
brokenEarlyReturn(TRUE)
# Error in brokenEarlyReturn(TRUE) :
# Should not get here if x is TRUE. x == TRUE
问题在于,我没有return()
而只有return
而没有以下括号。这导致if语句大致等于if (x) constant
,其中正文是不执行任何操作的裸字。在这种情况下,裸字是return
函数本身的定义,函数继续而不是返回。正确的版本如下所示:
workingEarlyReturn = function(x=TRUE) {
if (x) return() # parentheses added to return
stop("Should not get here if x is TRUE. x == ", x)
}
返回后R需要括号是有意义的,但作为C程序员,我偶尔会忘记添加它们。如果省略它们通常会出现解析错误,但在if语句正文中没有返回的情况下。
假设我希望能够在函数顶部放置一个“guard”语句,如果某个条件不满足将返回没有值的函数,我将来如何避免出现此错误?或者至少,当我做这个错误时,如何更容易追踪这个错误?是否有一些“表达没有效果”警告我可以打开?