如何绕过r中的for循环中的错误?

时间:2016-02-18 16:53:50

标签: r for-loop error-handling

我创建了一个for循环,将目录中的几个csv文件合并到一个表中。在某些情况下,尚未创建循环中指示的文件。当文件不存在时,循环会产生错误,并且不会合并任何文件。我正在尝试调整代码,以便循环插入" NULL"或"错误"在为文件保留的矩阵部分中。

以下是原始代码:

COMP_raw <- cbind(m, matrix(-9999, ncol = length(dirnames), nrow = 169))
setwd() #actual wd is removed for posting

for(i in length(dirnames)){
  j<-dirnames[1] #Take the directory folder name
  id<-gsub("_.*$","",dirnames[1]) #Take the numeric identifier of the indicator
  fpath <- file.path(paste(j,"/",id,"_2016",".csv", sep = "")) #Merge the directory folder name and desired csv to a file path format
  data<-read.csv(fpath,header = TRUE, as.is = TRUE)
  last <- max(ncol(data))
  COMP_raw[,(1+1)] <- data[,last]
  colnames(COMP_raw)[(1+1)] <- names(data[last])
}

以上代码适用于&#34; fpath&#34;实际存在于我的目录中。当csv不存在时,会出现以下消息。

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
  cannot open file '2.1_PermitIndirectCosts/2.1_2016.csv': No such file or directory

我查看了其他一些帖子,看看如何解决问题,并尝试了以下

COMP_raw <- cbind(m, matrix(-9999, ncol = length(dirnames), nrow = 169))

for(i in length(dirnames)){
  j<-dirnames[1] #Take the directory folder name
  id<-gsub("_.*$","",dirnames[1]) #Take the numeric identifier of the indicator
  fpath <- file.path(paste(j,"/",id,"_2016",".csv", sep = "")) #Merge the directory folder name and desired csv to a file path format
  possibleerror<- tryCatch(data<-read.csv(fpath,header = TRUE, as.is = TRUE),silent = TRUE),
           error=function(e) e
  )
           if(!inherits(possibleerror,"error"))
  {last <- max(ncol(data))
  COMP_raw[,(1+3)] <- data[,last]
  colnames(COMP_raw)[(1+3)] <- names(data[last])}
}

但这仍然会产生错误

2 个答案:

答案 0 :(得分:2)

使用file.exists()怎么样?

  

file.exists返回一个逻辑向量,指示其参数命名的文件是否存在。

COMP_raw <- cbind(m, matrix(-9999, ncol = length(dirnames), nrow = 169))
setwd() #actual wd is removed for posting

for(i in length(dirnames)){
    j <- dirnames[1] #Take the directory folder name
    id <- gsub("_.*$","",dirnames[1]) #Take the numeric identifier of the indicator
    fpath <- file.path(paste(j,"/",id,"_2016",".csv", sep = "")) #Merge the directory folder name and desired csv to a file path format

    #Checks if file exists if not, assign NULL
    if(file.exists(fpath)){
        data <- read.csv(fpath,header = TRUE, as.is = TRUE)
        last <- max(ncol(data))
        COMP_raw[,(1+1)] <- data[,last]
        colnames(COMP_raw)[(1+1)] <- names(data[last])
    } else{
        colnames(COMP_raw)[(1+1)] <- NULL 
    } 
}

答案 1 :(得分:0)

不是特定于您的示例(我在移动设备上),但它应该有所帮助:

var <- try(some function)
if(is(var, "try-error")){
some other function
next;}

如果尝试失败,它会为变量赋值“try-error”,您可以相应地处理。接下来将转到循环中的下一个项目。