我正在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)
答案 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
电话的范围,但我知道没有其他方法可以实现这一目标。