如何编织单个 .一次将 RMD 转换为一批多个 .HTML?

How to Knit a single .Rmd to a batch of multiple .HTML at once?

提问人:rzapatadaniloe 提问时间:7/19/2023 更新时间:7/20/2023 访问量:66

问:

我有一个 .Rmd 块,用于从另一个 . 中的分析函数加载数据帧列表。R 文件。在单独的 .R 文件,我有代码来编织 .具有某些参数的 Rmd 文件。

目标是保存一个 .html 文件,其中包含 1 到 17 范围内每个值的函数输出。

目前,我的方法导致.Rmd 文件遍历整个范围并加载所有 17 个输出,但它只导出最后一个。另一方面,.R 文件编织 .Rmd 到 .html 17 次,每次将导出保存在同一文件上。

这是我正在使用的方法。

.RMD代码

{r report1, echo=FALSE, message=FALSE, warning=FALSE}
#Source file to load function
source('function_file.R')

# Iterate over 1 to 17
for (i in 1:17) {
  # load function from file and save output in a list for each obs.
  output_list <- list_function(i)
}
# Next comes printing from output_list

.R代码



# Write function to render .Rmd file 
render_report <- function(index) {
  # Parameters
  params <- list(index = index)
  
  # Render .Rmd file into HTML
  rendered_report <- rmarkdown::render("rmd_file.Rmd", params = params)
  
  # output name for .HTML file
  html_output <- paste0("rep_", indice, ".html")
  
  # save as .HTML
  file.copy(rendered_report, html_output)
  
  # delete temp generated by render()
  file.remove(rendered_report)
}

# vector with desired indexes
indexes <- 1:17

# Iterate over indexes and render .Rmd for each one
for (index in indexes) {
  render_report(index)
} 

我需要每次渲染文件时,都会更改函数的一个索引,以便渲染 1 到 17 范围内的下一个输出。

我将不胜感激。

R-R-Markdown 针织品 HTML 渲染

评论


答:

1赞 margusl 7/19/2023 #1

有了参数化报告,所有这些功能都已经存在。下面是一个 Rmd 笔记本的示例,其中包含用于生成一系列 HTML 报告的所有代码。

参数可以在文档开头的 YAML 块中与默认值一起定义,该参数(此处:)稍后可以在 R 中引用为 ;它也适用于内联 R 表达式和 YAML(检查它在 YAML 中的使用方式)。report_indexparams$report_indextitle

报表生成循环仅调用每个所需的参数值。无需复制或移动呈现的报表,相反,我们可以设置参数并让它处理它。rmarkdown::render()report_indexoutput_filermarkdown::render()

以下示例中的最后一个代码块用于呈现;它通过设置从输出和评估中排除,因此必须手动执行。或者,它可以保存在单独的 R 文件中。knitreval=FALSE, echo=FALSE

多报告。马币 :
---
output: html_document
params:
  report_index : 1
title: "Report `r params$report_index`"
---

```{r setup, echo=FALSE, message=FALSE, warning=FALSE}
# something to simulate a function in function_file.R
# returns a list of 3 vectors
list_function <- function(i){
  list(".5" = .5, "1" = 1, "2" = 2) |>
    lapply(\(sd_) rnorm(100, i, sd_)) 
}
```

```{r report, echo=FALSE, message=FALSE, warning=FALSE}
# for parametrized report, use params$report_index to refer to report index:
data_list <- list_function(params$report_index)
df <- stack(data_list)

hist(df$values, main = paste("Report index", params$report_index))
boxplot(values ~ ind, data = df, main = "By ind")
```

```{r render, eval=FALSE, echo=FALSE}
# rendering block, only for manual execution, not evaluated during knitting

# generate 5 reports:
for (i in 1:5){
  rmarkdown::render("multi-report.Rmd", 
                  output_file = sprintf("rep_%.2d", i),
                  params = list(report_index = i),
                  quiet = TRUE)
}

# list resulting files:
fs::dir_info(glob = "*rep*")[1:3]

# screenshots of first three:
webshot2::webshot(list.files(pattern =  "html$")[1:3], zoom = .5) |>
  lapply(png::readPNG) |>
  lapply(grid::rasterGrob) |> gridExtra::marrangeGrob(nrow = 1, ncol = 3, top = NA)
```

最后一个块的结果和前三个报告的屏幕截图:

# A tibble: 6 × 3
  path             type         size
  <fs::path>       <fct> <fs::bytes>
1 multi-report.Rmd file        1.35K
2 rep_01.html      file      639.74K
3 rep_02.html      file      639.95K
4 rep_03.html      file      639.55K
5 rep_04.html      file      639.53K
6 rep_05.html      file      640.62K

report screenshots