解决方案
如果您呈现代码以及在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)
```
这会产生如下输出:
详细信息:knitr 的工作原理
当knitr renders an R Markdown file 时,它会在以下阶段这样做:
-
knitr 从您的原始 .Rmd 生成一个普通的降价文件。这是使用 yaml 标头和块选项之类的东西的时候,并且是至关重要的当你的 R 代码开始运行时
- 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 代码的运行。