Как создать html отчет напрямую из R-скрипта? - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть сценарий 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 Уценка и knitr, есть ли способ динамически генерировать отчет html, вызывающий функцию внутри кода? без файла уценки .rmd и без передачи всего скрипта функции, подобной

rmarkdown::render('myscript.R')

1 Ответ

0 голосов
/ 07 февраля 2020

Это решение принимает код в виде строки, создает файл 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 может даже не быть необходимым

...