Я хотел бы создать колоду слайдов powepoint в rmarkdown, итеративно создавая слайды для каждого дня. См. пример ниже и код, который создает функцию для вывода графиков. Я просто не знаю, как добавить эти графики в слайд-колоду, не сохраняя и не добавляя их вручную.
library(ggplot2)
library(tidyverse)
airquality<-datasets::airquality
glimpse(airquality)
vec<-unique(airquality$Day)
id=1
fctn<-function(id){
airquality_filtered<- airquality%>%filter(Day==id)
ggplot(airquality_filtered)+geom_point(aes(Ozone,Solar.R))+ggtitle(paste("Day",id))
ggsave(plot=last_plot(),paste("C:\\Users\\",id,"plot1.png"),width=6.25,height=3.75)
ggplot(airquality_filtered)+geom_line(aes(Ozone,Wind))+ggtitle(paste("Day",id))
ggsave(plot=last_plot(),paste("C:\\Users\\",id,"plot2.png"),width=6.25,height=3.75)
ggplot(airquality_filtered)+geom_point(aes(Ozone,Temp))+ggtitle(paste("Day",id))
ggsave(plot=last_plot(),paste("C:\\Users\\",id,"plot3.png"),width=6.25,height=3.75)
ggplot(airquality_filtered)+geom_bar(aes(Wind,Temp),stat='identity')+ggtitle(paste("Day",id))
ggsave(plot=last_plot(),paste("C:\\Users\\",id,"plot4.png"),width=6.25,height=3.75)
}
lapply(1:3,fctn)
Это будет желаемый результат со слайдом для каждого дня, т.е. День 1 (слайд 1), День 2 (слайд 2) и т. д.





Если вам подходит чистое решение officer, то следующий код даст вам желаемый результат.
Сначала я использую patchwork::wrap_plots, чтобы склеить четыре графика за день вместе и сохранить их в list. После этого вы можете использовать цикл for для экспорта ваших графиков в pptx, сначала добавив слайд и, например, размещение графиков в соответствующем заполнителе.
Сложность заключается в том, чтобы получить имена макетов и заполнителей. Для этого взгляните на officer::layout_summary и officer::layout_properties.
Используя минимальный воспроизводимый пример, основанный на шаблоне pptx по умолчанию, поставляемом с officer:
library(officer)
library(tidyverse)
library(patchwork)
fctn <- function(id) {
title <- paste("Day", id)
airquality_filtered <- airquality %>% filter(Day == id)
list(
ggplot(airquality_filtered) +
geom_point(aes(Ozone, Solar.R)) +
ggtitle(title),
ggplot(airquality_filtered) +
geom_line(aes(Ozone, Wind)) +
ggtitle(title),
ggplot(airquality_filtered) +
geom_point(aes(Ozone, Temp)) +
ggtitle(title),
ggplot(airquality_filtered) +
geom_bar(aes(Wind, Temp), stat = "identity") +
ggtitle(title)
) |>
wrap_plots(ncol = 2)
}
plots <- lapply(1:3, fctn)
pptx <- read_pptx()
for (i in seq_along(plots)) {
pptx <- add_slide(pptx, layout = "Title and Content", master = "Office Theme")
pptx <- ph_with(pptx, plots[[i]], location = ph_location_label(ph_label = "Content Placeholder 2") )
pptx <- ph_with(pptx, paste("Day", i), location = ph_location_label(ph_label = "Title 1") )
}
print(pptx, "my_plots.pptx")
Один из способов — использоватьexport::graph2ppt, который преобразует графики в слайды PowerPoint. graph2ppt имеет параметр append, который добавляет графики к одному и тому же pptx, если установлено значение TRUE.
library(ggpubr)
library(export)
library(purrr)
library(ggplot2)
library(dplyr)
days <- c(1:3)
plts <- map(
days,
function(x){
base_plot <- airquality |> filter(Day == x) |> ggplot()
scatter1 <- base_plot + geom_point(aes(Ozone,Solar.R)) + ggtitle(paste0("Day",x))
line <- base_plot + geom_line(aes(Ozone,Wind)) + ggtitle(paste("Day",x))
scatter2 <- base_plot + geom_point(aes(Ozone,Temp)) + ggtitle(paste("Day",x))
bar <- base_plot + geom_bar(aes(Wind,Temp),stat='identity') + ggtitle(paste("Day",x))
return(ggarrange(scatter1, line, scatter2, bar, ncol=2, nrow=2))
}
)
# export to ppt
for (p in plts){
graph2ppt(p, file = "slide", append=T)
}
Оба они великолепны! Я решил проверить второй ответ, так как он немного лучше соответствовал моим потребностям с расположением ширины участка в соответствии с моим макетом.