2016-07-27 13 views
2

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

assertError()默认情况下不会发现(你必须先加载“工具”包),但stopifnot()是。

更重要的是,即使我传递参数如TRUEFALSE,而assertError()总是抛出一条错误消息,而stopifnot()会执行明显的和预期的操作。

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

+0

我不认为'assertError()'做你认为它可能。它被设计用于分析代码以找到预期的错误而不是进行计算,并且如果它找不到解析错误只会引发实际的错误 – Henry

+0

因此,当存在解析错误或警告时,这些函数会产生错误?这对我来说听起来像一个奇怪的概念(我与C的assert()一起长大)。 –

+0

否。如果没有解析错误,'assertError()'会引发错误。这是一个断言,有一个错误 – Henry

回答

3

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

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") } 
) 

运行这段代码没有产出,期望的行为。

现在,如果我们发表意见stopifnot在mydiv这样的:

mydiv <- function(a,b) { 
    #stopifnot(abs(b)>0) 
    a/b 
} 

并再次测试tryCatch块,我们得到如下的输出:

[1] "Warning, mydiv accept to divide by 0" 

这是测试功能的一个小例子如预期的那样真的抛出错误。

tryCatch块只是展示一个不同的消息,我希望这给这个主题更多的灯光。

+0

你能举一个正确使用的例子吗?您的描述仍然有些抽象。 –

+0

好的,我明白了。可能命名和简明手册是困惑我的观点。也许'assert.IsError()'会是更好的名字。在像艾菲尔这样的语言中,人们会在'mydiv'中添加'require b/= 0',记录并检查'mydiv'如果'b == 0'('not b/= 0')不起作用。 –