在R中出现错误消息后添加更多详细信息

时间:2014-12-22 07:22:28

标签: r error-handling try-catch

我有一个类似下面的函数,在循环中创建矩阵。

foo <- function(x, y, z) {
  out <- list(a1 = NULL, a2 = NULL, a3 = NULL)
  for (i in 1:3) {
    t <- 100 * i
    a <- matrix(x, y + t, z)
    out[[i]] <- t(a)
  }
  return(out)
}

以下运行正常。     p&lt; -foo(NA,100,50)

但是以下内容给出了cannot allocate vector of length错误

q <- foo(NA, 3500000, 50)

我希望在messageadjust arguments 'y' and 'z'错误之后添加一些额外的cannot allocate vector of length too many elements specified,只要它们出现在我的函数中。

我正在尝试trytryCatch,但在循环中发生错误时似乎无法获得所需的结果。怎么做?

1 个答案:

答案 0 :(得分:4)

您可以使用简单的装饰器模式丰富错误消息:

safify <- function(f){
    function(...){
        tryCatch({
            f(...)
        },
        error=function(e){
            msg=conditionMessage(e)
            if(grepl("cannot allocate", msg)){
                msg=paste(msg, " Adjust arguments 'y' and 'z'", sep='.')
                return(msg)
            }
            msg
        })
    }
}

safefoo = safify(foo)

#res=safefoo(NA, 3500000, 50)
#> res
#[1] "cannot allocate vector of size 667.6 Mb. Adjust arguments 'y' and 'z'"

通过这种方式,您可以捕获可能发生的每种类型的错误,并丰富您想要的错误。