打印在for循环中抛出错误的列表项,并继续下一个列表项

时间:2018-01-12 17:23:10

标签: r error-handling

我正在尝试为长列表中的哪个文件引发错误添加一些清晰度。我已经尝试在for中包装tryCatch()循环,但我无法得到我正在寻找的行为。我想要的结果是:如果文件i抛出错误sprintf("Error: %s has a formatting problem", i)

下面,我们创建一个包含三个文件的目录,其中两个文件应该被for循环正确读入一个列表,一个会抛出错误,因为它是一个xlsx文件。

请注意,以下代码将创建和删除目录和三个文件

dir.create("Demo999")
setwd("Demo999")

write.csv(mtcars,"mtcars.csv")
xlsx::write.xlsx(mtcars,"mtcars.xlsx")
write.csv(mtcars,"mtcars2.csv")


files <- list.files()
data <- list()

for (i in files){
    f <- read.csv(i)
    data[[i]] <- f

}

# clean up generated files

setwd("..")
unlink("Demo999", recursive= TRUE, force= TRUE)

我想要的输出是:

“错误:mtcars.xlsx存在格式问题。”

此代码无法运行,但是示例tryCatch块:

tryCatch({
  for (i in files){
    f <- read.csv(i)
    data[[i]] <- f
  }
}, error = function() sprintf("Error: %s has a formatting problem", i))

1 个答案:

答案 0 :(得分:1)

tryCatch 置于循环中,而不是在循环之外。你不想尝试整个循环,如果循环失败则做其他事情;您希望循环尝试每个列表元素,并在失败时打印错误。这样,您可以返回并仅重新尝试失败的文件。试试这个:

for (i in files){
    tryCatch({
      f <- read.csv(i)
      data[[i]] <- f
      },
      error = function(e) print(sprintf("Error: %s has a formatting problem", i))
    )
}
# [1] "Error: mtcars.xlsx has a formatting problem"

names(data)
# [1] "mtcars.csv"  "mtcars2.csv"

请注意,在这个很好的示例中,您知道names(data)取得了哪些成功,因此您可以轻松找到fails = setdiff(files, names(data))