首页 > 解决方案 > 使用 knitr 通过循环创建部分

问题描述

请参阅此可重现的示例:

---
title: "test"
output: html_document
---

## foo

```{r}
plot(1:3)
```

## bar

```{r}
plot(4:7)
```

## baz

```{r}
plot(8:12)
```

我希望能够自动创建这些部分,因为在进一步分析之前我不知道它们会有多少。

我得到这个的输入是:

my_list   <- list(foo = 1:3, bar = 4:7, baz = 8:12)
my_fun    <- plot
my_depth  <- 2

理想的答案(尽管我欢迎任何改进)将帮助我构建一个mdapply函数,以便我可以运行:

```{r}
mdapply(X = my_list, FUN = my_fun, title_depth = my_depth)
```

并获得相同的输出。

标签: rmarkdownr-markdownknitr

解决方案


R 包pander可以动态生成 Pandoc 的降价。

关键是使用 chunk 选项results='asis'告诉 R Markdown 将 pander 的输出渲染为 Markdown。您只需要小心生成有效的 Markdown!

尝试这个:

---
title: "Test sections"
output: html_document
---

## A function that generates sections

```{r}
library(pander)

create_section <- function() {

   # Inserts "## Title (auto)"
   pander::pandoc.header('Title (auto)', level = 2)

   # Section contents
   # e.g. a random plot
   plot(sample(1000, 10))

   # a list, formatted as Markdown
   # adding also empty lines, to be sure that this is valid Markdown
   pander::pandoc.p('')
   pander::pandoc.list(letters[1:3])
   pander::pandoc.p('')
}
```

## Generate sections

```{r, results='asis'}
n_sections <- 3

for (i in seq(n_sections)) {
   create_section()
}
```

它看起来仍然很老套,但 Markdown 有其局限性......


推荐阅读