Как связать один .Rmd с несколькими .HTML одновременно?
У меня есть фрагмент .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 ответ
В параметризованных отчетах вся эта функциональность уже имеется. Вот пример одного блокнота Rmd, включающего весь код для создания серии отчетов HTML.
Параметры могут быть определены в блоке YAML в начале документа вместе со значениями по умолчанию, на этот параметр (здесь: ) позже можно ссылаться в R какparams$report_index
; он также работает для встроенных выражений R и в YAML (проверьте, как он используется дляtitle
в YAML).
Цикл генерации отчетов просто вызывает каждый желаемыйreport_index
значение параметра. Нет необходимости копировать или перемещать готовые отчеты, вместо этого мы можем установитьoutput_file
аргументируйте и позвольтеrmarkdown::render()
справиться с этим.
Последний блок кода в следующем примере предназначен для рендеринга; это исключено изknitr
вывод и оценка путем установкиeval=FALSE, echo=FALSE
, поэтому его необходимо выполнить вручную. Или его можно сохранить в отдельном файле R.
мульти-отчет.Rmd:
---
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