首页 > 解决方案 > 如何直接从 R 脚本生成 html 报告?

问题描述

我有一个 R 脚本,比如说 myscript.R,它做了很多事情,最终输出是一个包含许多不同组件的列表对象。我想将列表传递给一个函数,该函数生成一个 html 报告“注入”预格式化模板中的各种组件。代码是这样的:

main_fun = function() {

  # do some stuff 

  d1 = list(
    a = 42,
    b = "foo",
    c = c("elem1","elem2","elem3")
  )

  generate_report(d1)
}

generate_report = function(data) {
  # generate html report
}

(实际上显然列表的组件的值是“做一些事情”部分的输出)

我是 R Markdown 和 knitr 的新手,有一种方法可以动态生成 html 报告,调用代码中的函数?没有 .rmd 降价文件,也没有将整个脚本传递给类似的函数

rmarkdown::render('myscript.R')

标签: rr-markdownknitrreporting

解决方案


此解决方案采用字符串形式的代码并创建 Rmd 文件并将其呈现为 html:

编辑1:我还应该提到我只在RStudio上测试过这个......

my_markdown_rederer <- function(text) {

  rmd_file_name <- "temp.Rmd"

  yaml_header <- "---
output:
  html_document:
    toc: true
    fig_caption: true
    theme: flatly
---"

  content <- paste0(yaml_header,
                    "\n",
                    "\n",
                    "```{r, echo=FALSE}\n",
                    text,
                    "\n",
                    "```\n")

  write(content, rmd_file_name)

  rmarkdown::render(rmd_file_name)
  utils::browseURL(paste0("file://", utils::URLencode(gsub("Rmd$", "html", rmd_file_name))))
}


text <- 'd1 = list(
  a = 42,
  b = "foo",
  c = c("elem1","elem2","elem3"))

  d1'

my_markdown_rederer(text)

编辑 2:我们也可以直接使用已经存在的 .R 文件

text <- 'd1 = list(
  a = 42,
  b = "foo",
  c = c("elem1","elem2","elem3"))

  d1'

# Create .R file for example where we make html from an existing file
# 
fileConn <- file("file_with_original_pure_R_code.R")
writeLines(text, fileConn)
close(fileConn)



# Example using an existing .R file
# 
file_handler <- file("file_with_original_pure_R_code.R")
text <- paste0(readLines(file_handler), collapse="\n")
close(file_handler)
my_markdown_rederer(text)

编辑 3: yaml 标头甚至可能不是必需的


推荐阅读