I have a list with 100 plots which I want to automate via quarto such that each plot is produced in a new slide of a power point presentation.
I am using Quarto 1.4.555
with R 4.4.0
via RStudio 2024.4.2.764
Here is a reproducible example of what I did:
---
title: "test-auto"
format: pptx
---
```{r setup, include=FALSE}
library(knitr)
library(tidyverse)
```
```{r load-data}
plot_list_q <- list(
ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point(),
ggplot(mtcars, aes(x = hp, y = drat)) + geom_point()
)
```
```{r function}
# Slide creation function
create_slide <- function(plot, index) {
knit_expand(text = c(
paste("## Plot", index),
"",
"```{r}",
"plot_list_q[[{{index}}]]",
"```"
))
}
```
```{r generate}
#| echo: false
#| results: asis
# Generate all slides
slides <- map2(plot_list_q, seq_along(plot_list_q), create_slide)
cat(unlist(slides), sep = "\n")
```
There are indeed two plot slides, but the plot is not generated:
I think the problem lies within knit_expand
which does not evaluate the code within the same environment and the variable substitution is not correct. Hence I would try to use knit_child()
:
create_slide <- function(plot, index) {
knitr::knit_child(text = c(
paste("## Plot", index),
"",
"```{r}",
"plot_list_q[[", index, "]]",
"```"
), envir = environment(), quiet = TRUE)
}
BTW: you could use map2_chr
, than you would not need the unlist
in the cat
function.