stopifnot() 与 assertError()

U. *_*ndl 4 r assertions

我不知道之间的差别stopifnot()assertError()有:

assertError()默认情况下未找到(您必须首先加载“工具”包),但是stopifnot()

更重要的是, assertError() 总是会抛出错误消息,即使我传递了像TRUEor 之类的参数FALSE,而stopifnot()做明显和预期的事情。

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

Ten*_*bai 5

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

stopIfnot如果在运行期间不满足某些条件,则旨在停止执行assertError以测试您的代码。

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

> length(x) != 7
Error: object 'x' not found
Run Code Online (Sandbox Code Playgroud)

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

SoassertError主要用于测试驱动开发模式 (TDD) 中的测试用例,当您的代码/函数应该为某些特定参数引发错误并确保稍后更新函数时不会破坏它。

的实施例的使用stopifnotassertError

mydiv <- function(a,b) {
  stopifnot(b>0)
  a/b
}
Run Code Online (Sandbox Code Playgroud)

现在让我们做一个测试,以确保如果我们将“b”传递为 0,这会引发错误:

tryCatch(
  assertError(mydiv(3,0)),
  error = function(e) { print("Warning, mydiv accept to divide by 0") }
)
Run Code Online (Sandbox Code Playgroud)

运行此代码不会产生任何输出,而是所需的行为。

现在,如果我们像这样评论 mydiv 中的 stopifnot:

mydiv <- function(a,b) {
  #stopifnot(abs(b)>0)
  a/b
}
Run Code Online (Sandbox Code Playgroud)

再次测试tryCatch块,我们得到这个输出:

[1] "Warning, mydiv accept to divide by 0"
Run Code Online (Sandbox Code Playgroud)

这是一个测试函数是否真的按预期抛出错误的小例子。

tryCatch 块只是为了展示不同的消息,我希望这能让更多人了解这个主题。