Напишите несколько фреймов данных (список df), чтобы превзойти рабочие листы, где df name == имя листа - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь сохранить несколько фреймов данных на нескольких листах одной книги, где имя листа совпадает с именем df.

Допустим, мы разбили следующее в списке df $ 1 на df 10Как я могу сохранить их в книгу с листами с именами от 1 до 10.

library(tidyverse)
library(openxlsx)

data <- tibble( x = 1:10,
                y = runif(10,0.1,10),
                z = runif(10,0.1,10))

df <- split(data, data$x)

wb <- loadWorkbook("template.xlsx")

Здесь пропущен шаг, я устал использовать purrr: map (почти не имеет опыта с purrr и R в целом), но неуверен, как передать, что df $ 1 соответствует листу с именем 1.

map(df,function(x) x %>% 
      writeData(wb,.....)
saveWorkbook(wb, "finished_workbook.xlsx")

Любая помощь очень ценится:)

1 Ответ

1 голос
/ 09 апреля 2019

Вам не нужен внешний пакет, mapply может делать то, что вы хотите.
Обратите внимание, что рабочая книга "template.xlsx" уже должна существовать.

library(openxlsx)

df <- split(data, data$x)

wb <- loadWorkbook("template.xlsx")

Теперь сложная часть.Эта функция вызывается mapply для записи нескольких таблиц в листах с именами от "1" до "10".

Функция fun предполагает, что листы уже существуют, но не предполагает, что они пусты.Он начинается с просмотра количества таблиц на каждом листе и (если есть) (length(g) > 0) удаляет их все.Только тогда он записывает таблицу x с вызовом tryCatch, обернутым вокруг writeDataTable, чтобы отследить возможные ошибки.
Если есть ошибка, вернуть ее, если нет, вернуть строку символов "Ok".

fun <- function(s, x){
  g <- getTables(wb, sheet = s)
  if(length(g) > 0){
    sapply(g, function(.g) removeTable(wb, s, .g))
  }
  err <- tryCatch(writeDataTable(wb, s, x),
                  error = function(e) e)
  if(inherits(err, "error")) err else "Ok"
}

mapply(fun, names(df), df)
#   1    2    3    4    5    6    7    8    9   10 
#"Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok"

saveWorkbook(wb, "template.xlsx", overwrite = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...