Как пропустить / обработать пустой лист / нет листа в R Excel Automation? - PullRequest
0 голосов
/ 03 апреля 2019

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

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».Таким образом, это приведет к ошибке для всего фрейма данных «Лист_2».

1 Ответ

2 голосов
/ 03 апреля 2019

Вы можете использовать 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 при выполнении этого шага уменьшения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...