Как я могу использовать обработку ошибок при чтении xlsx-файлов в R?

#r #excel

#r #excel

Вопрос:

Я пытаюсь прочитать 23 файла Excel, сохранить каждый в списке, а затем повторно связать их с одним csv. Некоторые из этих файлов представляют собой csv, а некоторые — xlsx. Однако я получил следующее сообщение:

 Error: Can't establish that the input is either xls or xlsx.
  

Итак, я хочу определить, какие из них выдают ошибку, а затем добавить ее вручную.

Моя функция заключается в следующем:

 make_df<-function(filename){
  library(readxl)
  library(foreign)
  if (str_sub(filename,-3,-1) == "csv"){
    df<-read.csv(filename,fileEncoding="latin1")
  }
    else{
      df<-read_excel(filename)
    }
  return(df)
}

filenames_vector<-list.files(# directory)


datalist = list()

for (i in 1:23){
  datalist[[i]] <- make_df(filenames_vector[i])
}


mega_data = do.call(rbind,datalist)
  

Как я могу добавить что-то в make_df, чтобы распечатать имена файлов, которые вызывают сообщение об ошибке? Кроме того, есть ли другой способ обойти, когда сообщение об ошибке не может отличить xlsx от xls?

Ответ №1:

Это можно сделать с помощью блока tryCatch. Без примеров данных это немного сложно воссоздать. Я не уверен, что вы имеете в виду в своем втором вопросе.

Попробуйте приведенный ниже код для обнаружения ошибок и распечатайте имя файла, если есть ошибка, в противном случае верните объект df.

 make_df<-function(filename){
  library(readxl)
  library(foreign)

  df = tryCatch(
   { # try block
     if (str_sub(filename,-3,-1) == "csv"){
       df<-read.csv(filename,fileEncoding="latin1")
     }
     else{
       df<-read_excel(filename)
     }
   },
   error=function(cond){return(filename)} # grab the filename if there was an error
  )

  if (class(df) == 'character') {
    print(df)
  } else{return(df)}

}
  

Комментарии:

1. Спасибо! Я попробую это. Второй вопрос был просто вопросом, есть ли другие способы решения сообщения об ошибке, потому что я не уверен, что вызывает проблему.