【问题标题】:rmarkdown execution of code inside a variablermarkdown 执行变量内的代码
【发布时间】:2021-12-03 19:14:48
【问题描述】:

我有类似下面的代码,动态生成并存储在一个变量中:

---
title: "test"
author: "me"
date: "3 June 2019"
output: html_document
---

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

```{r, comment=""}
for (i in 1 :  3) { 
  cat('\n') 
  print(summary(iris[i*50 : 50, "Sepal.Length"] ))
}
```

假设它存储在一个名为rmkdown_code的变量中

现在,我需要能够执行此变量中的代码并将其呈现为 html 或 pdf。我知道results = asis 选项,并且我尝试了它的不同变体。但是,我仍然无法让上面的代码在 html 中呈现。 html 页面出现在 rstudio 中,它显示了 rmkdown_code 变量的内容。它只是没有执行它。

我需要将rmkdown_code 的内容呈现为好像来自平面文件一样。

我尝试了以下方法,但都没有奏效。有些更好地格式化了文本,但没有绘制图表。我想避免将rmkdown_code 变量的内容写入平面文件。

```{r,echo=FALSE,eval=TRUE}
knitr::knit_expand(text=rmkdown_code)

#eval(parse(text = rmkdown_code))
#eval(c(paste0("- `", rmkdown_code, "`"), sep = "\n"))
#eval(knitr::asis_output(rmkdown_code))
#res <- knitr::knit_expand(text=rmkdown_code);knitr::knit(text=res, quiet=F)
# knitr::inline_expr("2+2")
```

dput(rmarkdown)的输出:

## "---\ntitle: \"test\"\nauthor: \"me\"\ndate: \"3 June 2019\"\noutput: html_document\n---\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(echo = TRUE)\n```\n\n```{r, comment=\"\"}\nfor (i in 1 :  3) { \n  cat('\\n') \n  print(summary(iris[i*50 : 50, \"Sepal.Length\"] ))\n}\n```\n"

【问题讨论】:

  • 您能否提供以下输出:dput(rmarkdown_code)?不清楚代码是如何存储在变量中的。
  • @Matt 我已经用详细信息更新了原始帖子。还有什么我可以提供的吗?
  • 变量是expression 还是character 代码字符串? 编辑:刚刚看到你的更新,似乎是后者。
  • @Greg 你有什么建议吗?
  • 恐怕不会,因为我在这个特定领域的背景纯粹是学术背景,缺乏经验。事实上,我很想看到任何可能出现的答案。

标签: r r-markdown knitr rscript


【解决方案1】:

这是一个解决方案,不确定它是否适合您的用例,但它确实成功地将 rmkdown_code 呈现为 HTML 报告。

确保您设置了工作目录或正在项目中工作,因为 .rmd 将呈现到您当前的 wd。

rmkdown_code <- "---\ntitle: \"test\"\nauthor: \"me\"\ndate: \"3 June 2019\"\noutput: html_document\n---\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(echo = TRUE)\n```\n\n```{r, comment=\"\"}\nfor (i in 1 :  3) { \n  cat('\\n') \n  print(summary(iris[i*50 : 50, \"Sepal.Length\"] ))\n}\n```\n"

render_func <- function(x){
  writeLines(x, "temp.rmd")
  rmarkdown::render("temp.rmd")
}

render_func(rmkdown_code)

这给了我们:

【讨论】:

  • 谢谢。这个答案的问题是它创建了一个临时文件。我非常想避免将变量内容写入任何文件。
  • 如果输入不是markdown 文件,我不确定rmarkdown::render() 的工作方式。是否可以在您的 C:/ 驱动器上创建一个临时文件,然后自动删除它?
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2019-01-31
相关资源
最近更新 更多