stopifnot() 与 assertError()

stopifnot() vs. assertError()

我想知道 stopifnot()assertError() 之间的区别是什么:

默认情况下找不到

assertError()(您必须先加载 "tools" 包),但 stopifnot() 是。

更重要的是,assertError() 总是抛出一条错误消息,即使我传递了 TRUEFALSE 之类的参数,而 stopifnot() 做了显而易见的预期事情。

阅读手册页没有帮助。 assertError(length(x) != 7) 的正确用法是什么?如果 x 未定义,语句不会产生错误,但一旦定义,它就会产生错误,与 x 的长度无关(7 或不是)。

主要区别在于应该在哪里使用它们。

stopIfnot 旨在在 运行 期间不满足某些条件时停止执行,其中 assertError 旨在测试您的代码。

assertError 预计它的参数会引发错误,这是未定义 x 时发生的情况,有错误

> length(x) != 7
Error: object 'x' not found

当您将此表达式传递给 assertError 时,它会引发错误并 assertError return 满足条件(错误本身)。这允许您测试代码的失败案例。

所以 assertError 主要用于测试驱动开发模式 (TDD) 中的测试用例,当您的 code/function 应该针对某些特定参数引发错误并确保您更新您的稍后运行你不会破坏它。

stopifnotassertError 的用法示例:

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 块只是为了展示不同的消息,我希望这能让更多人了解这个主题。