R Функция повтора на объекте - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь использовать officer для добавления изображений в документ Word. У меня есть целый каталог изображений, которые я хочу просмотреть. Проблема, с которой я столкнулся, заключается в том, что мне нужно добавить изображение в документ, а затем добавить следующее изображение во вновь созданный документ, который я только что создал, добавив последнее изображение.

Вот образец кода без циклы или функции:

library(magrittr)
library(officer)
read_docx() %>% # create document
  body_add_img("img1.png", width = 3, height = 4) %>% # add image
  body_add_img("img2.png", width = 3, height = 4) %>% # add image
  body_add_img("img3.png", width = 3, height = 4) %>% # add image
  print(target = "samp.docx") # write document

Использование map и lapply не работает в этом случае, потому что каждая итерация должна возвращать объект предыдущей итерации. Я попытался написать функцию с for l oop, но я думаю, что это было далеко. Любая помощь и указатели приветствуются.

Ответы [ 2 ]

4 голосов
/ 09 июля 2020

Я не уверен, какова была ваша попытка с for l oop, но этот простой l oop кажется, работает.

library(officer)
data <- read_docx()
image_list <- paste0('img', 1:3, '.png')

for(i in image_list) {
     data <- body_add_img(data, i, width = 3, height = 4)
}
print(data, target = "samp.docx")
3 голосов
/ 09 июля 2020

Думаю, здесь можно использовать reduce. Например, используя бит purrr

library(purrr)
read_docx() %>% 
  reduce(1:3, function(docx, idx) {
       docx %>% body_add_img(paste0("img", idx, ".png"), width = 3, height = 4)
    }, .init=.) %>%
  print(target = "samp.docx")

, сокращение продолжает возвращать результат в себя.

...