Как связать один .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

Другие вопросы по тегам