当代码在第一次运行时就拥有提供详尽帮助的所有信息时,必须逐一解决问题是令人沮丧的。
and1 <- function(a , b) {
stopifnot(is.logical(a), is.logical(b))
a & b
}
and1(0, 1) # nope
#> Error in and1(1, 2): is.logical(a) is not TRUE
# fix it
and1(FALSE, 1) # still not good
#> Error in and1(FALSE, 2): is.logical(b) is not TRUE
# fix again
and1(FALSE, TRUE) # finally works
#> [1] FALSE
Run Code Online (Sandbox Code Playgroud)
我们可以设计复杂的组合,但这看起来很糟糕,并且通过更多的检查,它会变得非常复杂。
and2 <- function(a , b) {
if (!is.logical(a)) {
if (!is.logical(b)) {
stop("\n`a` must be logical\n`b` must be logical")
}
stop("`a` must be logical")
}
if (!is.logical(b)) {
stop("`b` must be logical")
}
stopifnot(is.logical(a), is.logical(b))
a & b
}
and2(1,2)
#> Error in and2(1, 2):
#> `a` must be logical
#> `b` must be logical
Run Code Online (Sandbox Code Playgroud)
在没有混乱的代码的情况下执行此操作的好方法是什么?
我可能会创建一个命名的逻辑向量,然后检查该向量
and1 <- function(a,b){
checks <- c(
"`a` must be logical" = !is.logical(a),
"`b` must be logical" = !is.logical(b)
)
if(any(checks)) {
paste("\n",names(checks[which(checks)]), collapse = "") |>
stop()
}
a & b
}
and1(1,2)
#> Error in and1(1, 2) :
#> `a` must be logical
#> `b` must be logical
Run Code Online (Sandbox Code Playgroud)
(根据需要格式化错误消息)
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |