簡體   English   中英

在 purrr 中創建 RMarkdown 標頭和代碼塊

[英]Create RMarkdown headers and code chunks in purrr

以下.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')而是將其顯示為代碼塊?

解決方案

如果您在result='asis'塊中呈現代碼以及運行代碼的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 呈現 R Markdown 文件時,它會在以下階段進行:

  1. knitr從你原來的.Rmd生成一個普通的 markdown 文件。 這是使用 yaml 標頭和塊選項之類的東西的時候,並且在您的 R 代碼運行時至關重要
  2. pandoc 將 markdown 文件轉換為最終輸出。 此處發生的情況取決於您使用的輸出格式。

knitr 的工作原理

使用results='asis'

chunk 選項results = 'asis'只是改變了中間 Markdown 腳本在渲染過程中的樣子。 例如,

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

將被呈現為如下所示的降價:(注意這里的縮進意味着這是根據降價語法的代碼):

    ## # print('# Header')

然而,如果使用results = 'asis' ,您將獲得降價

print('# Header')

要意識到的關鍵是,盡管"print('# Header')"是有效的 R 代碼,它只出現在過程的第2階段,也就是在所有 R 代碼都已運行之后。

帶回家的消息

不幸的是,您不能期望results='asis'會輸出 R 代碼然后運行它,因為此時knitr已經完成了您的 R 代碼的運行。

實現目標的另一種方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM