当表达式返回零长度时,使R stopifnot或类似的简单函数引发错误

时间:2018-01-06 04:05:04

标签: r validation error-handling

我使用R中的stopifnot函数来验证预期结果。但是,我注意到如果表达式返回长度为0的向量,则stopifnot不会引发错误。这是一个简单的可重复的例子。

想象一个优化函数,其中一个列表元素名为convergence,包含0或1,我希望验证名为convergence的元素是否包含0,否则会引发错误。< / p>

return01 <- function(x){
    return(list(convergence = x))
}
opt1 <- return01(1)

我可以使用stopifnot轻松完成我想要的验证。

stopifnot(opt1$convergence == 0) # raises desired error

但是,假设我键入了错误的元素名称,例如converged而不是convergence。我的验证不再引发任何错误,因为opt1$convergedNULLopt1$converged == 0已解析为logical(0)

stopifnot(opt1$converged == 0) # does not raise an error
stopifnot(NULL == 0) # does not raise an error

我已经提出了下面的解决方法,我也总是要验证表达式的长度。

stopifnot(opt1$converged == 0, length(opt1$converged == 0) > 0) # raises an error
stopifnot(NULL == 0, length(NULL == 0) > 0) # raises an error

这里是否有更简单,更优雅或更好的练习解决方案,使此验证对返回logical(0)的表达式具有鲁棒性,同时保留stopifnot(opt1$convergence == 0)的简单性和简洁性,而不必显式执行另一个表达式使用length?具体来说,如果表达式返回logical(0),我希望验证也会引发错误。

1 个答案:

答案 0 :(得分:1)

检查它是否与零相同:

stopifnot(identical(opt1$convergence, 0))

或者如果收敛通常是整数类型,请使用0L

如果收敛不是0,则上面的代码会引发错误。例如,

stopifnot(identical(1, 0))
## Error: identical(1, 0) is not TRUE

stopifnot(identical(NULL, 0))
## Error: identical(NULL, 0) is not TRUE

stopifnot(identical(numeric(0), 0)
## Error: identical(numeric(0), 0) is not TRUE

stopifnot(identical(logical(0), 0))
## Error: identical(logical(0), 0) is not TRUE