Экспорт всех элементов в списке столбцов с помощью `office`

Я работаю над отчетом, для которого мне нужно экспортировать большое количество похожих фреймов данных в красивые таблицы в Word. Мне удалось получить первый бит, создав список столбцов из flextable объектов, используя purrr (SO вопрос для справки).

Теперь я хотел бы записать все сгенерированные таблицы в документ с одним словом, что для отдельных объектов flextable можно сделать с помощью следующей процедуры:

library(tidyverse)
library(flextable)
library(officer)

# Basic data frame
df <- data.frame(school = c("A", "B", "A", "B", "A", "B"),
        students = c(round(runif(6, 1, 10), 0)),
        grade = c(1, 1, 2, 2, 3, 3))

# Generating column list containing flextable objects
list <- df %>% 
    group_by(school) %>%
    nest() %>% 
    mutate(ftables = map(data, flextable))

# Exporting single flextable object into Word
read_docx() %>% body_add_flextable(list$ftables[[2]]) %>% print("path")

Я, очевидно, хочу избежать необходимости делать это для всех строк в ftables и, что важно, все таблицы должны быть записаны в один и тот же документ Word последовательно.

Я играл с функциями purrr и циклами записи, но самое дальнее, что я сделал, это запись таблиц в отдельные документы Word.


person tifu    schedule 24.01.2018    source источник


Ответы (1)


Ты можешь попробовать

my_doc <- read_docx()
for(i in seq_along(list1$ftables)){
  my_doc <- body_add_flextable(my_doc,list1$ftables[[i]]) %>% 
    body_add_break() 
}
print(my_doc, target = "Doc.docx") %>% invisible()

Совет: не используйте имена функций для сохранения объектов. Таким образом, я переименовал list в list1. Идея состоит в том, чтобы использовать цикл и всегда сохранять в один и тот же документ, добавляя разрыв страницы.

Или попробуйте purrr решение:

# build a function to write a function
write_word_table <- function(var, doc){
  doc %>%
    body_add_flextable(var) %>% 
    body_add_break() }

my_doc <- read_docx()
# use walk (the invisible function of map) to include all tables in one doc
walk(list1$ftables, write_word_table, my_doc) 
print(my_doc, target = "Doc1.docx") %>% invisible()
person Roman    schedule 24.01.2018