Программно генерировать слайды в R с помощью Xaringan и плотно

Я недавно начал использовать xaringan, и это действительно здорово. Спасибо Yihui за отличный пакет. Один вопрос, который меня интересовал, возможно ли программно генерировать слайды, каждый из которых содержит сюжетный график, в цикле for? Я знаю, что могу создавать слайды ggplots, например, где ggplot_list - это список ggplots:

```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  print(p)
}
```

Это работает отлично.

Я также могу включить отдельные сюжетные участки по телефону ggplotly(ggplot_list[[1]]), что тоже отлично работает.

Но я не могу заставить эту комбинацию работать, наивно, делая следующее, я получаю пустые слайды.

```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  ggplotly(p)
}
```

Обновление: здесь я привожу минимальный пример того, что я пробовал до сих пор.

---
title: "xaringan + plotly + loop?"
subtitle: "Does it work?"
author: "Fenfen Kan"
date: "2017/13/32"
output:
  xaringan::moon_reader:
    lib_dir: libs
    nature:
      highlightStyle: github
      highlightLines: true
      countIncrementalSlides: false
---

```{r setup, include=FALSE}
options(htmltools.dir.version = FALSE)
```

# Several boring ggplots

```{r, message=FALSE, warning=FALSE}
library(ggplot2)
library(plotly)

p1 <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point(aes(color=Species))

p2 <- ggplot(iris, aes(Petal.Length, Petal.Width)) +
  geom_point(aes(color=Species))

p3 <- ggplot(iris, aes(Sepal.Length, Petal.Length)) +
  geom_point(aes(color=Species))

ggplot_list <- list(p1, p2, p3)
```


---
# Invididual plotly works

```{r}
ggplotly(p1)
```

---
# ggplot slides in loop also works

```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  print(p)
}
```

---
# plotly in loop doesn't work

```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  ggplotly(p)
}
```

# print(ggplotly(p)) in loop doesn't work either
```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  print(ggplotly(p))
}
```

1 ответ

Решение

Я нашел решение, когда пытался сделать подобное в knitr относительно недавно. Я добавил это в приведенный выше пример. Смотрите последний раздел - он генерирует 3 сюжетных слайда в цикле.

---
title: "xaringan + plotly + loop?"
subtitle: "Does it work?"
author: "Fenfen Kan"
date: "2017/13/32"
output:
  xaringan::moon_reader:
    lib_dir: libs
    nature:
      highlightStyle: github
      highlightLines: true
      countIncrementalSlides: false
---

```{r setup, include=FALSE}
options(htmltools.dir.version = FALSE)
```

# Several boring ggplots

```{r, message=FALSE, warning=FALSE}
library(ggplot2)
library(plotly)
library(knitr)

p1 <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point(aes(color=Species))

p2 <- ggplot(iris, aes(Petal.Length, Petal.Width)) +
  geom_point(aes(color=Species))

p3 <- ggplot(iris, aes(Sepal.Length, Petal.Length)) +
  geom_point(aes(color=Species))

ggplot_list <- list("p1"=p1, "p2"=p2, "p3"=p3)
```


---
# Invididual plotly works

```{r}
ggplotly(p1)
```

---
# ggplot slides in loop also works

```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  print(p)
}
```

---
# plotly in loop doesn't work

```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  ggplotly(p)
}
```

# print(ggplotly(p)) in loop doesn't work either
```{r, message=FALSE, warning=FALSE, results='asis'}
for (p in ggplot_list) {
  cat("\n\n---\n")
  print(ggplotly(p))
}
```

# generate chunks, then explicitly calling `knit` works! 

```{r create-markdown-chunks-dynamically, include=FALSE}

out = NULL
for (p_name in names(ggplot_list)) {
  knit_expanded <- paste0("\n\n---\n## Plot: ", p_name, "\n\n```{r results='asis', echo=FALSE, warning=FALSE, message=FALSE}\n\nggplotly(ggplot_list[['", p_name, "']])\n\n```")
  out = c(out, knit_expanded)
}

```

<!--- knit those table chunk statements --> 
`r paste(knit(text = out), collapse = '\n')`
Другие вопросы по тегам