我正在尝试为长列表中的哪个文件引发错误添加一些清晰度。我已经尝试在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))
答案 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))
。