我使用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$converged
为NULL
且opt1$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)
,我希望验证也会引发错误。
答案 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