stopifnot
位于 base
包(package)。 说明
如果任何表达式(在 ...
或 exprs
中)不是 all
TRUE
,则调用 stop
,并生成一条错误消息,指示第一个表达式 ( all
) 不为 true。
用法
stopifnot(..., exprs, exprObject, local = TRUE)
参数
... , exprs |
任意数量的R表达式,每个表达式的计算结果应为(所有表达式的逻辑向量) { expr1 expr2 .... } 请注意,例如,正数是不是 如果向 |
exprObject |
|
local |
(仅当使用 |
细节
此函数旨在用于回归测试或函数的参数检查,特别是使它们更易于阅读。
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
的所有部分并传递结果,即通常为exprs
到 stopifnot()
的最后一个条目。
然而,更仔细的版本,
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"
})
也可以看看
stop
,warning
; tools
包中的 assertCondition
补充了 stopifnot()
,用于测试警告和错误。
相关用法
- R stop 停止函数执行
- R strsplit 分割字符向量的元素
- R strtoi 将字符串转换为整数
- R strrep 重复字符向量的元素
- R standardGeneric 形式化方法系统 – 调度 S4 方法
- R startsWith 字符串是否以另一个字符串开头或结尾?
- R strwrap 将字符串换行以设置段落格式
- R strptime 与字符之间的日期时间转换函数
- R strtrim 将字符串修剪为指定的显示宽度
- R structure 属性规范
- R seq.Date 生成规则的日期序列
- R search 给出 R 对象的搜索路径
- R solve 求解方程组
- R scan 读取数据值
- R sprintf 使用 C 风格字符串格式化命令
- R sign 标志函数
- R svd 矩阵的奇异值分解
- R source 从文件、连接或表达式中读取 R 代码
- R sQuote 引用文字
- R switch 选择替代方案列表之一
- R substitute 替换和引用表达式
- R split 分组并重新集合
- R slice.index 数组中的切片索引
- R sort 对向量进行排序或排序
- R sequence 创建序列向量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Ensure the Truth of R Expressions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。