覆盖R中其他包的错误消息

覆盖R中其他包的错误消息,r,error-handling,package,try-catch,grepl,R,Error Handling,Package,Try Catch,Grepl,我想在R中创建自己的错误消息,以覆盖另一个包中的错误消息。下面是一个简单的reprex: myfunc <- function(x,y,string=TRUE){ if(string){ x+y }else{ print("not numeric") } } myfunc(2,"yes") 我想用我自己的特定于我的包的错误消息,例如,您是否忘记使用string=TRUE?,将x+y:non-numeric参数中的

我想在R中创建自己的错误消息,以覆盖另一个包中的错误消息。下面是一个简单的reprex:

myfunc <- function(x,y,string=TRUE){
  
  if(string){
    x+y
  }else{
    print("not numeric")
  }
}

myfunc(2,"yes")
我想用我自己的特定于我的包的错误消息,例如,
您是否忘记使用string=TRUE?
,将x+y:non-numeric参数中的
错误改写为二进制运算符。我已经在函数中实现了
tryCatch
grepl
,并且它可以工作,但我不确定这是否是最好的方法:

myfunc <- function(x,y,string=TRUE){
  
  tryCatch(myfunc(x,y),
           error=function(err){
             if (grepl("non-numeric", err$message)) {
               stop("Did you forget to use string=TRUE?")
             }
           })
  
  if(string){
    x+y
  }else{
    print("not numeric")
  }
}

myfunc(2,"yes")

这就是我想要的,尽管我更希望它没有说
值错误[[3L]](cond)
。有没有办法摆脱它?此外,这是覆盖错误消息的最佳方法,还是有其他更好的方法?

而不是
停止
可能使用
消息

myfunc <- function(x,y,string=FALSE){
  
  if(!string){
    tryCatch(x+y, error = function(err) {
      if (grepl("non-numeric", err$message)) {
        message("Error : Did you forget to use string=TRUE?")
      }
    })
  }else{
    print("not numeric")
  }
}

myfunc(2,"yes")
#Error : Did you forget to use string=TRUE?

myfunc(2,4)
#[1] 6

myfunc(2,"yes", string = TRUE)
#[1] "not numeric"

myfunc这是可行的——但现在它还将默认错误消息打印出来:
x+y中的错误:非数值参数到二进制运算符
。关于如何隐藏它有什么想法吗?它不会为我打印默认消息。它只打印
错误:您忘记使用string=TRUE了吗?
。你在控制台上运行我的函数了吗?哦,我看到你改变了不止一件事。我现在正在跟踪,它确实起了作用。然而,当我运行
myfunc(2,“yes”,string=TRUE)
时,我仍然得到
错误:您是否忘记使用string=TRUE?
是,这是因为
string
仍然是
TRUE
。我认为你需要一个不同于你在你的职位上的逻辑。如果我的答案更接近你想要的,请查看我的更新答案。啊,是的,谢谢。不幸的是,这在这个例子中效果很好,但在我的函数中效果不好(我认为我把它简化得太多了)。不过,这给了我很多工作要做,所以,谢谢你!!
Error in value[[3L]](cond) : Did you forget to use string=TRUE?
In addition: There were 50 or more warnings (use warnings() to see the first 50)
Called from: value[[3L]](cond)
myfunc <- function(x,y,string=FALSE){
  
  if(!string){
    tryCatch(x+y, error = function(err) {
      if (grepl("non-numeric", err$message)) {
        message("Error : Did you forget to use string=TRUE?")
      }
    })
  }else{
    print("not numeric")
  }
}

myfunc(2,"yes")
#Error : Did you forget to use string=TRUE?

myfunc(2,4)
#[1] 6

myfunc(2,"yes", string = TRUE)
#[1] "not numeric"