在 purrr 中创建 RMarkdown 标头和代码块

Dyl*_*ell 5 r r-markdown

以下.Rmd是我认为应该产生我正在寻找的内容:

---
title: "Untitled"
date: "10/9/2021"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

full_var <- function(var) {
  cat("### `", var, "` {-} \n")
  cat("```{r}", "\n")
  cat("print('test')", "\n")
  cat("```", "\n")
}

vars <- c("1", "2", "3")
```

```{r results = "asis"}
purrr::walk(vars, full_var)
```
Run Code Online (Sandbox Code Playgroud)

相反,它看起来像:

例子

为什么print('test')不进行评估而是将其呈现为代码块?

Blu*_*oxe 9

解决方案

如果您渲染代码以及在块中运行代码的结果,result='asis'我认为您可以管理您所追求的内容。您可以通过利用 的功能来做到这一点,knitr如下knit()所示:

---
title: "Untitled"
date: "10/9/2021"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

full_var <- function(var) {
  
  # Define the code to be run
  my_code <- "print('test')"
  
  # Print the code itself, surrounded by chunk formatting
  cat("### `", var, "` {-} \n")
  cat("```{r}", "\n")
  cat(my_code, "\n")
  cat("``` \n")
  
  # Use knitr to render the results of running the code.
  # NB, the use of Sys.time() here is to create unique chunk headers,
  # which is required by knitr. You may want to reconsider this approach.
  cat(knitr::knit(
    text = sprintf("```{r %s}\n%s\n```\n",  Sys.time(), my_code), 
    quiet = TRUE
  ))
}

vars <- c("1", "2", "3")
```

```{r results = "asis"}
purrr::walk(vars, full_var)
```
Run Code Online (Sandbox Code Playgroud)

这会产生如下输出: 代码输出

详细信息:如何knitr运作

knitr 渲染 R Markdown 文件时,它会分以下几个阶段进行:

  1. knitr从您的原始 .txt 文件生成一个纯 Markdown 文件.Rmd。这是使用 yaml 标头和块选项等内容的时候,并且至关重要的是,当您的 R 代码运行时
  2. pandoc 将 markdown 文件转换为最终输出。这里到底发生什么取决于您使用的输出格式。

针织物的工作原理

使用results='asis'

chunk 选项results = 'asis'只是改变中间 Markdown 脚本在渲染过程中的样子。例如,

```{r}
cat("print('# Header')")
```
Run Code Online (Sandbox Code Playgroud)

将被渲染为 Markdown,如下所示:(注意,这里的缩进意味着这是根据 Markdown 语法的代码):

    ## # print('# Header')
Run Code Online (Sandbox Code Playgroud)

然而,如果results = 'asis'使用,您将得到降价

print('# Header')
Run Code Online (Sandbox Code Playgroud)

需要认识到的关键一点是,虽然"print('# Header')"是有效的 R 代码,但它仅出现在流程的第2阶段,即所有 R 代码都已运行之后。

带回家的信息

不幸的是,您不能期望results='asis'输出 R 代码然后运行它,因为knitr此时您的 R 代码已经完成运行。