2016-07-27 92 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')不起作用。 –