是否可以覆盖基本 R 错误消息?

Is it possible to overwrite base R error messages?

我想覆盖来自基本 R 函数的不是很有帮助的错误消息,并将其替换为自定义错误消息。我怎样才能做到这一点?

为澄清起见,假设我对以下表达式求值 "a" + "b"。因为我试图添加两个字符,R 会抱怨并且 return““a”+“b”中的错误:二元运算符的非数字参数”。

有没有办法捕捉到这个准确的错误信息,并且 return 一个更清晰的错误信息,例如“您正在尝试添加两个因素 - 这是不允许的”?

我想起点是使用 try 函数和 grepl:

a <- try("a" + "a", silent = TRUE)

if(inherits(a, "try-error")){
  cond <- sum(grepl("non-numeric argument to binary operator", deparse(a), fixed = TRUE)) > 0
  if(cond){
    stop("You are trying to add two characters. This is not allowed.")
  }
}

但也许还有更多 'generic' 或 'elegant' 的方法来做到这一点?

您可以使用 inherits 检查 class 然后使用 "condition" 属性如下使用 grepl 就像您建议的那样

a <- try("a" + "a", silent = TRUE)
if(inherits(a, "try-error") && grepl("non-numeric argument to binary operator$", attr(a, "condition")$message))
    stop("You are trying to add two non-numbers")
#R> Error: You are trying to add two non-numbers

但似乎很多事情都可能导致此错误。例如

a <- try(list() + list(), silent = TRUE)
if(inherits(a, "try-error") && grepl("non-numeric argument to binary operator$", attr(a, "condition")$message))
    stop("You are trying to add two non-numbers")
#R> Error: You are trying to add two non-numbers

一个更好的主意可能是在可能的情况下检查参数。例如。使用 stopifnot().