提问人:rzapatadaniloe 提问时间:7/19/2023 更新时间:7/20/2023 访问量:66
如何编织单个 .一次将 RMD 转换为一批多个 .HTML?
How to Knit a single .Rmd to a batch of multiple .HTML at once?
问:
我有一个 .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 范围内的下一个输出。
我将不胜感激。
答:
1赞
margusl
7/19/2023
#1
有了参数化报告,所有这些功能都已经存在。下面是一个 Rmd 笔记本的示例,其中包含用于生成一系列 HTML 报告的所有代码。
参数可以在文档开头的 YAML 块中与默认值一起定义,该参数(此处:)稍后可以在 R 中引用为 ;它也适用于内联 R 表达式和 YAML(检查它在 YAML 中的使用方式)。report_index
params$report_index
title
报表生成循环仅调用每个所需的参数值。无需复制或移动呈现的报表,相反,我们可以设置参数并让它处理它。rmarkdown::render()
report_index
output_file
rmarkdown::render()
以下示例中的最后一个代码块用于呈现;它通过设置从输出和评估中排除,因此必须手动执行。或者,它可以保存在单独的 R 文件中。knitr
eval=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
评论