當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R stopifnot 確保 R 表達式的真實性


R語言 stopifnot 位於 base 包(package)。

說明

如果任何表達式(在 ...exprs 中)不是 all TRUE ,則調用 stop ,並生成一條錯誤消息,指示第一個表達式 ( all ) 不為 true。

用法

stopifnot(..., exprs, exprObject, local = TRUE)

參數

... , exprs

任意數量的R表達式,每個表達式的計算結果應為(所有表達式的邏輯向量)TRUE.采用任何一個 ... 或者 exprs,後者通常是以下形式的未評估表達式

{
   expr1
   expr2
   ....
}

請注意,例如,正數是不是 TRUE,即使他們被迫TRUE,例如,在裏麵if(.)或者在算術計算中R.

如果向 ... 提供名稱,它們將用於代替默認錯誤消息。

exprObject

exprs... 的替代方案:“expression-like”對象,通常是 expression ,但也可以是 callname 或原子常量,例如 TRUE

local

(僅當使用exprs時:)指示應在其中計算表達式的environment;默認情況下,stopifnot() 被調用。

細節

此函數旨在用於回歸測試或函數的參數檢查,特別是使它們更易於閱讀。

stopifnot(A, B) 或等效的 stopifnot(exprs= {A ; B}) 在概念上等同於

 { if(any(is.na(A)) || !all(A)) stop(...);
   if(any(is.na(B)) || !all(B)) stop(...) }

自從R版本3.6.0,stopifnot()不再處理潛在的錯誤或警告(通過tryCatch()等)對於每個單個表達式並且可以使用sys.call(<n>)如果表達式的計算結果不全為 TRUE,則獲取有意義且簡短的錯誤消息。這提供了相當少的開銷。

自從R版本 3.5.0,表達式按順序評估,因此一旦出現“non-TRUE”,評估就會停止,如上述概念等價語句所示。

另外,自從R版本3.5.0,stopifnot(exprs = { ... })可以交替使用,並且在多個表達式的情況下可能更可取,因為它們更方便地交互評估(“沒有無關的,”)。

自從R版本 3.4.0,當表達式(來自...) 不正確是一個電話all.equal,錯誤消息將報告由報告的(第一部分)差異all.equal(*);自從R4.3.0,所有調用都會發生這種情況"all.equal" pmatch()es 被調用的函數,例如,當調用該函數時all.equalShow,請參閱中的示例all.equal.

(NULL 如果 ... 中的所有語句都是 TRUE 。)

注意

嘗試通過快捷方式使用 stopifnot(exprs = ..) 版本,例如,

 assertWRONG <- function(exprs) stopifnot(exprs = exprs) 

是微妙的,上麵不是一個好主意。與 stopifnot() 不同,stopifnot() 會逐個評估 exprs 的各個部分並在第一個非 TRUE 處停止,上述快捷方式通常會評估 exprs 的所有部分並傳遞結果,即通常為exprsstopifnot() 的最後一個條目。

然而,更仔細的版本,

 assert <- function(exprs) eval.parent(substitute(stopifnot(exprs = exprs))) 

使用更常見的動詞作為函數名稱來調用 stopifnot(exprs = *) 可能是一個不錯的捷徑。

例子

stopifnot(1 == 1, all.equal(pi, 3.14159265), 1 < 2) # all TRUE

m <- matrix(c(1,3,3,1), 2, 2)
stopifnot(m == t(m), diag(m) == rep(1, 2)) # all(.) |=>  TRUE

op <- options(error = expression(NULL))
# "disabling stop(.)"  << Use with CARE! >>

stopifnot(length(10)) # gives an error: '1' is *not* TRUE
## even when   if(1) "ok"   works

stopifnot(all.equal(pi, 3.141593),  2 < 2, (1:10 < 12), "a" < "b")
## More convenient for interactive "line by line" evaluation:
stopifnot(exprs = {
  all.equal(pi, 3.1415927)
  2 < 2
  1:10 < 12
  "a" < "b"
})

eObj <- expression(2 < 3, 3 <= 3:6, 1:10 < 2)
stopifnot(exprObject = eObj)
stopifnot(exprObject = quote(3 == 3))
stopifnot(exprObject = TRUE)


# long all.equal() error messages are abbreviated:
stopifnot(all.equal(rep(list(pi),4), list(3.1, 3.14, 3.141, 3.1415)))

# The default error message can be overridden to be more informative:
m[1,2] <- 12
stopifnot("m must be symmetric"= m == t(m))
#=> Error: m must be symmetric

options(op)  # revert to previous error handler

##' warnifnot(): a "only-warning" version of stopifnot()
##'   {Yes, learn how to use do.call(substitute, ...) in a powerful manner !!}
warnifnot <- stopifnot ; N <- length(bdy <- body(warnifnot))
bdy        <- do.call(substitute, list(bdy,   list(stopifnot = quote(warnifnot))))
bdy[[N-1]] <- do.call(substitute, list(bdy[[N-1]], list(stop = quote(warning))))
body(warnifnot) <- bdy
warnifnot(1 == 1, 1 < 2, 2 < 2) # => warns " 2 < 2 is not TRUE  "
warnifnot(exprs = {
    1 == 1
    3 < 3  # => warns "3 < 3 is not TRUE"
})

也可以看看

stopwarningtools 包中的 assertCondition 補充了 stopifnot(),用於測試警告和錯誤。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Ensure the Truth of R Expressions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。