【问题标题】:Create RMarkdown headers and code chunks in purrr在 purrr 中创建 RMarkdown 标头和代码块
【发布时间】:2021-10-10 04:23:38
【问题描述】:

以下.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)
```

相反,它看起来像:

为什么print('test') 没有被评估,而是作为代码块呈现?

【问题讨论】:

  • 你在寻找什么输出?
  • 你想要print('test')而不是cat("print('test')", "\n")吗?

标签: r r-markdown


【解决方案1】:

解决方案

如果您呈现代码以及result='asis' 块中运行代码的结果,我认为您可以管理您所追求的。您可以利用knitrknit() 函数来做到这一点,如下所示:

---
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)
```

这会产生如下输出:

详细信息:knitr 的工作原理

knitr renders an R Markdown file 时,它会在以下阶段这样做:

  1. knitr 从您的原始 .Rmd 生成一个普通的降价文件。这是使用 yaml 标头和块选项之类的东西的时候,并且是至关重要的当你的 R 代码开始运行时
  2. pandoc 将 markdown 文件转换为最终输出。此处发生的具体情况取决于您使用的输出格式。

使用results='asis'

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

```{r}
cat("print('# Header')")
```

会被渲染成如下的markdown:(注意这里的缩进表示这是按照markdown语法的代码):

    ## # print('# Header')

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

print('# Header')

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

带回家的信息

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

【讨论】:

    【解决方案2】:

    实现目标的另一种方式:

    ---
      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(eval(parse(text = "print('test')")), "\n")
      cat("```", "\n")
    }
    
    vars <- c("1", "2", "3")
    ```
    
    ```{r results = "asis"}
    purrr::walk(vars, full_var)
    ```
    

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 2021-11-29
      • 2018-09-08
      • 2017-12-08
      • 1970-01-01
      • 2018-11-15
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多