在应用函数中,如果出现错误,如何获得部分结果?

时间:2015-04-07 14:30:41

标签: r

我正在R中进行一些网络抓取并将结果存储在数据框中。如果错误使函数跳闸,我希望能够查看截至该点的结果。我看到的错误示例是Error in data.frame... arguments imply differing number of rows

这是一个可重复的例子。当错误出现在第二次迭代时,我希望能够看到第一次的结果。这是错误处理的问题吗?我是否需要在for循环中执行此操作?

myfunc <- function(x) {
    cat("Now processing :", x, "\n")
    v1 <- c("A", "B", "C", "D")
    df <- data.frame(v1, x, stringsAsFactors = FALSE)
    cat("Data frame completed", "\n")
    return(df)
}

v2 <- c(1:4)
v3 <- c(5:9)
list1 <- list(v2, v3)

result <- lapply(list1, myfunc)

1 个答案:

答案 0 :(得分:1)

虽然我喜欢@Spacedman因缺乏副作用而提供的reference,但是返回不同长度的评论也可能会有问题。

我建议将此作为使用保持列表长度的withRestarts的二流替代方案。 (您可以始终将withRestarts实现夹在中间,以确保列表在末尾填充,从而避免了副作用并将返回的列表缩短。)

myfunc <- function(x) {
    if (! err) {
        message("Now processing :", x)
        v1 <- c("A", "B", "C", "D")
        tryCatch({
            dfm <- data.frame(v1, x, stringsAsFactors = FALSE)
            message("Data frame completed")
            return(dfm)
        }, error = function(e) {
            message("Problems processing, gracefully exiting")
            err <<- TRUE
            NULL
        })
    }
}

v2 <- c(1:4)
v3 <- c(5:9)
list1 <- list(v2, v3)

err <- FALSE
result <- lapply(list1, myfunc)
## Now processing :1234
## Data frame completed
## Now processing :56789
## Problems processing, gracefully exiting

result
## [[1]]
##   v1 x
## 1  A 1
## 2  B 2
## 3  C 3
## 4  D 4
## [[2]]
## NULL

每次遇到错误时都需要重置err <- FALSE(并且想重新运行循环)。

我并不特别喜欢超出lapply电话的范围,但我知道没有其他方法可以实现这一目标。