当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。