如何合并错误?

Moo*_*per 4 error-handling r

当代码在第一次运行时就拥有提供详尽帮助的所有信息时,必须逐一解决问题是令人沮丧的。

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)

在没有混乱的代码的情况下执行此操作的好方法是什么?

Tan*_*Tan 6

我可能会创建一个命名的逻辑向量,然后检查该向量

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)

(根据需要格式化错误消息)