我想知道 stopifnot()
和 assertError()
之间的区别是什么:
默认情况下找不到 assertError()
(您必须先加载“工具”包),但 stopifnot()
是。
更重要的是, assertError() 总是会抛出错误消息,即使我传递了 TRUE
或 FALSE
之类的参数,而 stopifnot()
会做显而易见的事情。
阅读手册页没有帮助。什么是正确使用而不是 assertError(length(x) != 7)
?如果 x
未定义,则语句不会产生错误,但一旦定义,就会产生错误,与 x
的长度(7 与否)无关。
最佳答案
主要区别在于应该在哪里使用它们。stopIfnot
旨在在运行期间不满足某些条件时停止执行,其中 assertError
旨在测试您的代码。assertError
期望它的参数引发错误,这是未定义 x
时发生的情况,有错误
> length(x) != 7
Error: object 'x' not found
当您将此表达式传递给
assertError
时,它会引发错误并且 assertError 返回满足的条件(错误本身)。这允许您测试代码的失败案例。因此
assertError
主要用于测试驱动开发模式 (TDD) 中的测试用例,当您的代码/函数应该为某些特定参数引发错误并确保稍后更新函数时不会破坏它。stopifnot
和 assertError
的示例用法:mydiv <- function(a,b) {
stopifnot(b>0)
a/b
}
现在让我们做一个测试,以确保如果我们将“b”传递为 0,这会引发错误:
tryCatch(
assertError(mydiv(3,0)),
error = function(e) { print("Warning, mydiv accept to divide by 0") }
)
运行此代码不会产生任何输出,而是预期行为。
现在,如果我们像这样评论 mydiv 中的 stopifnot:
mydiv <- function(a,b) {
#stopifnot(abs(b)>0)
a/b
}
再次测试
tryCatch
块,我们得到以下输出:[1] "Warning, mydiv accept to divide by 0"
这是一个测试函数是否真的按预期抛出错误的小例子。
tryCatch 块只是为了展示不同的消息,我希望这能让更多人了解这个主题。
关于r - stopifnot() 与 assertError(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38606429/