我有一个类似下面的函数,在循环中创建矩阵。
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)
我希望在message
或adjust arguments 'y' and 'z'
错误之后添加一些额外的cannot allocate vector of length
too many elements specified
,只要它们出现在我的函数中。
我正在尝试try
和tryCatch
,但在循环中发生错误时似乎无法获得所需的结果。怎么做?
答案 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'"
通过这种方式,您可以捕获可能发生的每种类型的错误,并丰富您想要的错误。