【问题标题】:Print list item that throws error in for loop, and continue with next list item打印在 for 循环中引发错误的列表项,并继续下一个列表项
【发布时间】:2018-01-12 17:23:09
【问题描述】:

我试图明确说明长列表中哪个文件引发了错误。我尝试将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))

【问题讨论】:

  • 顺便说一句,我非常感谢您包含清理代码。
  • @Gregor 很高兴,很高兴为任何愿意花时间提供帮助的人提供更轻松的生活!

标签: r error-handling


【解决方案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))

【讨论】:

  • 感谢您解释为什么 tryCatch 进入循环。现在这更有意义了。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2017-09-07
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多