通过knitr通过循环创建节

Moo*_*per 3 markdown r knitr r-markdown

请参见以下可重现的示例:

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

## foo

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

## bar

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

## baz

```{r}
plot(8:12)
```
Run Code Online (Sandbox Code Playgroud)

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

我的输入是:

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

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

```{r}
mdapply(X = my_list, FUN = my_fun, title_depth = my_depth)
```
Run Code Online (Sandbox Code Playgroud)

并获得相同的输出。

Lor*_*o G 14

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()
}
```
Run Code Online (Sandbox Code Playgroud)

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

  • 我不认为这很老套,实际上对我来说看起来很惯用。多谢!我想我实际上可以将其调整为应用函数。 (2认同)

Moo*_*per 5

看来我找到了方法!

整个想法是将要手动输入的内容作为字符串插入内knit(text=the_string)联代码中。

因此,该函数基本上将一串字符串粘贴在一起,并带有一点substitute魔力,使该函数看起来像是apply家族的一部分。

  • 参数depth决定#您要多少。

  • 参数options包含块选项(作为向量)。

向量不应该能够同时包含逻辑和字符,但是在这里没有关系,因为无论如何它们都会被强制转换为字符,所以c(echo= FALSE, results="hide")很好。

我希望它很容易折断,但轻柔地对待它似乎效果很好。

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

```{r setup, include = FALSE}
library(knitr)    
mdapply <- function(X, FUN, depth, options=""){
  FUN       <- as.character(substitute(FUN))
  list_name <- as.character(substitute(X))
  if(options != "")
    options <- paste(",",names(options),"=",options,collapse="")
  build_chunk <- function(nm)
  {
    paste0(
      paste0(rep("#",depth), collapse=""),
      " ",
      nm,
      "\n\n```{r", options, "}\n",
      FUN,
      "(", list_name, "[['", nm, "']])\n```")
  }      
  parts <- sapply(names(X), build_chunk)
  whole <- paste(parts, collapse="\n\n")
  knit(text=whole)
  }
```

```{r code}
my_list   <- list(foo = 1:3, bar = 4:7, baz = 8:12)
```

`r mdapply(my_list, plot, 2, c(echo=FALSE))`
Run Code Online (Sandbox Code Playgroud)