首页 > 解决方案 > 使用 for 循环时如何在 R 中编写 tryCatch() 函数?

问题描述

我一直在努力在我的代码中编写一个简单的 tryCatch() 。上周我已经问过这个问题(如何在从多个文件中提取数据时编写 tryCatch() 函数?)但无法使其正常工作。我正在处理数千个文件(扩展名为 .MOD),我想从每个文件中提取特定信息。这些信息将被收集到一张 Excel 表格中,每一行代表一个 .MOD 文件。以下是一个 .MOD 文件的示例。

> AR.MOD <- read.table("Sample1ar.MOD", header = FALSE, fill = TRUE)
> AR.MOD
    V1 V2        V3       V4   V5    V6   V7    V8
1 Case  1 23-3-2013 14:47:40                      
2  Run NA                                         
3    R  1    767,96  1647,72 1,78 18,88 0,66 37,33

我已经成功地使用以下代码从每个 .MOD 文件中提取信息:

> AR.MOD.files <- list.files(pattern = "AR.MOD|ar.MOD")
> for (fileName in AR.MOD.files) {
+     AR.MOD <- read.table(fileName, header = FALSE, fill = TRUE)
+     AR.MOD.subset1 <- AR.MOD[c(1), 3:4]
+     names(AR.MOD.subset1) <- c("Col1", "Col2")
+     AR.MOD.subset2 <- AR.MOD[c(3), 3:8]
+     names(AR.MOD.subset2) <- c("Col3", "Col4", "Col5", "Col6", "Col7", "Col8")
+     AR.MOD.final <- merge(AR.MOD.subset1, AR.MOD.subset2)
+     ID <- basename(fileName)
+     AR.MOD.final <- merge (ID, AR.MOD.final)
+     colnames(AR.MOD.final)[colnames(AR.MOD.final)=="x"] <- "ID"
+     if(match(fileName,AR.MOD.files)==1){
+         output.AR.MOD <- AR.MOD.final
+     }else{
+         output.AR.MOD <- rbind(output.AR.MOD,AR.MOD.final)}
+ }
> print(output.AR.MOD)
               ID       Col1     Col2   Col3    Col4 Col5  Col6 Col7  Col8
1   File1AR.MOD  7-12-2010 14:48:51 574,75 1028,04 2,69 11,68 0,62 37,33
2   File2AR.MOD 22-11-2011 11:43:02 536,15 1033,37 2,54 30,04 0,66 40,33
3   File3AR.MOD  8-11-2011 11:48:20 695,46 1616,14 1,20 35,34 0,65 58,00
4   File4AR.MOD 30-11-2010 12:27:08 825,39 1862,94 1,11  8,43 0,68 54,00
5   File5AR.MOD  25-1-2011 11:33:07 582,52 1205,84 2,03  7,32 0,67 44,00

但是,有时大约有 10-20 个文件(数以万计)不包含所需格式的信息(例如缺少一列 V8),这会导致以下错误并停止脚本。

Error in `[.data.frame`(AR.MOD, c(3), 3:8) : undefined columns selected 

因此,我尝试在上述脚本中包含一个 tryCatch() 函数,如下所示,以便脚本仍然可以继续运行。但我无法做到这一点。任何人都可以帮助我更正以下代码,以便在这些特定单元格中将有错误的文件替换为“错误”吗?

AR.MOD.files <- list.files(pattern = "AR.MOD|ar.MOD")
for (fileName in AR.MOD.files) {
    tryCatch(
        expr = {
            AR.MOD <- read.table(fileName, header = FALSE, fill = TRUE)
            AR.MOD.subset1 <- AR.MOD[c(1), 3:4]
            names(AR.MOD.subset1) <- c("Col1", "Col2")
            AR.MOD.subset2 <- AR.MOD[c(3), 3:8]
            names(AR.MOD.subset2) <- c("Col3", "Col4", "Col5", "Col6", "Col7", "Col8")
            AR.MOD.final <- merge(AR.MOD.subset1, AR.MOD.subset2)
            ID <- basename(fileName)
            AR.MOD.final <- merge (ID, AR.MOD.final)
            colnames(AR.MOD.final)[colnames(AR.MOD.final)=="x"] <- "ID"
            if(match(fileName,AR.MOD.files)==1){
                output.AR.MOD <- AR.MOD.final
            }else{
                output.AR.MOD <- rbind(output.AR.MOD,AR.MOD.final)}
        }
        error = function(e){
            message("Error")
            print(e)
        }
    )
}
print(output.AR.MOD)

以下是我想要的,以防任何文件出错:

  > print(output.AR.MOD)
                   ID       Col1     Col2   Col3    Col4 Col5  Col6 Col7  Col8
    1   File1AR.MOD  7-12-2010 14:48:51 574,75 1028,04 2,69 11,68 0,62 37,33
    2   File2AR.MOD 22-11-2011 11:43:02 536,15 1033,37 2,54 30,04 0,66 40,33
    3   File3AR.MOD  8-11-2011 11:48:20 Error  Error   Error Error Error Error
    4   File4AR.MOD 30-11-2010 12:27:08 825,39 1862,94 1,11  8,43 0,68 54,00
    5   File5AR.MOD  25-1-2011 11:33:07 582,52 1205,84 2,03  7,32 0,67 44,00

标签: rfor-looperror-handlingtry-catch

解决方案


推荐阅读