【问题标题】:Overwriting error messages from other packages in R覆盖R中其他包的错误消息
【发布时间】:2021-03-02 03:12:53
【问题描述】:

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

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

myfunc(2,"yes")

这会返回:

Error in x + y : non-numeric argument to binary operator

我想用我自己的特定于我的包的错误消息覆盖Error in x + y : non-numeric argument to binary operator,例如Did you forget to use string=TRUE?。我已经在函数中实现了tryCatchgrepl,它可以工作,但我不确定这是否是最好的方法:

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")

这会返回:

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)

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

【问题讨论】:

    标签: r error-handling package try-catch grepl


    【解决方案1】:

    可以用message 代替stop 吗?

    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"
    

    【讨论】:

    • 这行得通——但现在它还打印默认错误消息:Error in x + y : non-numeric argument to binary operator。关于如何隐藏它的任何想法?
    • 它不会为我打印默认消息。它只打印Error : Did you forget to use string=TRUE?。你在控制台中运行了我的函数吗?
    • 哦,我看到你改变了不止一件事。我现在正在关注,它确实有效。但是,当我运行myfunc(2,"yes",string=TRUE) 时,我仍然得到Error : Did you forget to use string=TRUE?
    • 是的,那是因为string 仍然是TRUE。我认为您需要与帖子中的逻辑不同的逻辑。如果这更接近您正在寻找的内容,请查看我的更新答案。
    • 啊,是的,谢谢。这适用于这个例子,但不适用于我的功能,不幸的是(我认为我简化了太多)。不过,这让我有很多工作要做,所以,谢谢!!
    猜你喜欢
    • 2016-09-13
    • 2013-06-09
    • 2019-07-18
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2014-04-07
    相关资源
    最近更新 更多