如何忽略错误并继续处理列表项?

时间:2010-11-09 19:39:54

标签: r error-handling

我使用包装函数通过glm.nb运行数百个数据集。没什么好看的,我只是通过llply传递每个列表项,然后使用glm.nb拟合,将系数写入data.frame并将其返回。

毫不奇怪,glm.nb无法收敛某些数据集。而不是让函数咳出一个错误并停止,我宁愿继续通过其余数据集并尽可能返回结果。

我的第一次尝试是:

res.model <- function(x)
       {
       res <- try(invisible(glm.nb(x~y, data=x)))
   if(!("try-error" %in% class(res)))
       {
    return (data.frame(site=unique(x$site_name),species=unique(x$species),coef=res$coefficients[2]))
       }
 }

有关忽略错误的更通用方法的任何想法,以便我可以使这项工作?

2 个答案:

答案 0 :(得分:10)

我有一个我运行的nls(),它有同样的挑战。我正在将回归应用于data.frame中的每个组,但是这个逻辑也适用于你(我认为):

 dlply(myData, c("group1", "group2"), function(df){  
       tryCatch(nls(depen ~ exp(a1 + b1 * year) , data=df, start = list(a1 = -1, b1 = 0), na.action=na.omit), error=function(e) NULL)

所以,如果我猜测如何将其应用于您的情况,那将是:

res <- trycatch(glm.nb(x~y, data=x), error=function(e) NULL )

我使用它的方式,我在任何时候回归都没有收敛时抛出NA值。你可能想要做一些不同的事情。

答案 1 :(得分:5)

您也可以在plyr中使用failwith功能。如果f是你传递给plyr的函数,你可以改为传递函数

safef = failwith(NA, f)

当然,您可以使用函数失败时所需的任何返回值替换NA。此代码直接从failwith的示例中解除。