Как пропустить / обработать пустой лист / отсутствие листа в R Excel Automation?

#r #excel #automation

#r #excel #автоматизация

Вопрос:

Я пытаюсь объединить / связать огромный набор данных. Код для этого написан и работает нормально. Проблема возникает при попытке объединить данные, в которых отсутствует лист. Есть ли какие-либо способы, с помощью которых я могу пропустить ошибку?

 library(tidyverse)
library(xlsx)

files <- list.files(pattern="*.xlsx")

read_Sheet_1 <- lapply(files, readxl::read_excel, sheet = "Sheet 1")
Sheet_1 = do.call(rbind, read_Sheet_1) 

read_Sheet_2 <- lapply(files, readxl::read_excel, sheet = "Sheet 2")
Sheet_2 = do.call(rbind, read_Sheet_2)

read_Sheet_3 <- lapply(files, readxl::read_excel, sheet = "Sheet 3")
Sheet_3 = do.call(rbind, read_Sheet_3) 

write.xlsx(as.data.frame(Sheet_1), file="Final.xlsx", sheetName="Sheet_1", row.names=FALSE)
write.xlsx(as.data.frame(Sheet_2), file="Final.xlsx", sheetName="Sheet_2", append=TRUE, row.names=FALSE)
write.xlsx(as.data.frame(Sheet_3), file="Final.xlsx", sheetName="Sheet_3", append=TRUE, row.names=FALSE)
  

Ожидаемый результат: объединенные строки из каждого листа в один Final.xlsx файл
Фактический результат: несмотря на то, что функции объединяют строки вместе. Ошибка возникает, если в одном из файлов всего 2 листа. Пример: File3.xlsx содержит только «Лист 1» и «Лист 3», а не «Лист 2». Таким образом, это приведет к возникновению ошибки для всего фрейма данных «Sheet_2».

Ответ №1:

Вы можете использовать safely из purrr пакета:

 library(tidyverse)
library(xlsx)

files <- list.files(pattern="*.xlsx")

read_excel_safe <- function(file, sheet) {
  read_excel_safely <- safely(readxl::read_excel, otherwise = NULL)
  read_excel_safely(file, sheet = sheet)$result
}

Sheet_1 <- files %>% 
  map(.f = read_excel_safe, sheet = 'Sheet 1') %>% 
  reduce(rbind) 
  

Функция read_excel_safely вернет именованный список с ошибкой и результатами. Если есть ошибка, результатом будет NULL . И это должно повлиять на rbind при выполнении этого шага сокращения.