如何使用knitr从r脚本函数生成多个文件

8
我希望能从R脚本中生成多个报告,避免编译rmd文件所需的重复操作,如果可能的话,我想直接从R脚本中生成报告。该脚本拥有一个函数,可从数据框列表中生成每个报告,其中每个报告代表一个数据框的处理过程。但我不知道如何单独生成每个报告。目前,报告在一个文件中显示了所有的数据框。
原始脚本很复杂,因此我提供了下面的简化版本。
    structure(list(a = structure(c(1L, 3L, 2L), .Label = c("boo", 
    "saa", "yaew"), class = "factor"), b = structure(c(2L, 3L, 
    1L), .Label = c("mfds", "shu", "ren"), class = "factor"), c = structure(c(2L, 
    1L, 3L), .Label = c("22", "23", "5345"), class = "factor")), .Names = c("a", 
    "b", "c"), row.names = c(NA, -3L), class = "data.frame")

    ReportOp<-function(n) { 
  this_is_a_name <- n; 
  this_is_my_data <- ldf[[n]] 

  #' ---
  #' author: Me
  #' date:
  #' ---

  #+results='asis', echo=FALSE
  knitr::kable(this_is_my_data, digits = 2)
  #'
} 

目前,我只是使用R Studio中的编译笔记本按钮生成包含所有内容的报告。

我尝试在单独的文件中使用以下脚本的knitr::spin

library(knitr)
o=spin('/Users/sebastianzeki/Desktop/UntitledTBB.R')
knit2html(o,output="/Users/sebastianzeki/Desktop/out.html")

但是我只能得到一个报告输出,而不是三个。

我使用带参数的R Markdown文档来进行这个目的,然后使用rmarkdown::render()函数的包装器迭代地渲染报告,可以使用lapplymapdo或任何你喜欢的方法。 - Jake Kaupp
@Jake Kaupp - 你的意思是我应该在 names(x) 后面插入 rmarkdown::render() 吗?我不明白的是在 markdown 文档中要放什么...感到困惑... - Sebastian Zeki
  1. 在YAML中创建一个带有参数的report.rmd文件。该报告应调用主数据集并根据您的选择对参数进行子集化。
  2. 使用rmarkdown::render()通过apply系列(或编写包装器并使用apply)呈现report.rmd文件和您的参数选择。我建议阅读rmarkdown::render()文档以获取所有内容。
- Jake Kaupp
@Jake Kaupp。问题在于参数会发生变化,所以我有点希望能够直接从函数中输出,而不需要创建.rmd文件。 - Sebastian Zeki
您可以创建一个单独的Markdown文件,并通过render()将参数传递给它。 - Jake Kaupp
1个回答

18

您可以制作一个单一的rmarkdown 参数化报告。在 YAML 中定义参数。通过以列表形式将参数传递给 rmarkdown::render() 来呈现报告。

您可以通过多种方式在 r 中对多组参数运行此操作,例如循环、apply 家族(在本例中为 mapply)、dplyr::dopurrr:map() 函数。在此示例中,我使用了 purrr::pmap()

Report.Rmd

---
title: "`r sprintf('mtcars %s vs. %s', params$variable1, params$variable2)`"
output: html_document
params:
  variable1: "mpg"
  variable2: "cyl"
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(ggplot2)
```
#Plot
Crazy report text!

```{r cars}
ggplot(mtcars, aes_(x = as.name(params$variable1), y = as.name(params$variable2))) +
  geom_point()
```

渲染函数

render_report <- function(var1, var2) {

  template <- "path_to/Report.Rmd"

  out_file <- sprintf("report %s vs. %s", var2, var1)

  parameters <- list(variable1 = var1,
                     variable2 = var2)

    rmarkdown::render(template,
                      output_file = out_file,
                      params = parameters)
  invisible(TRUE)
}

运行多个参数。

library(purrr)

params_list <- list(list("mpg","mpg","mpg"),
                    list("drat","wt","qsec"))

pmap(params_list, render_report)

输出

三个HTML文件,每个文件名对应参数,并显示根据参数绘制的散点图。

  1. drat vs mpg enter image description here

  2. qsec vs mpg enter image description here

  3. wt vs mpg enter image description here


谢谢你的回答!我对参数化knitr报告的一些细节不太清楚。 - Andrew Brēza
我有一个稍微不同的问题。你能帮忙吗?根据您的方法,我尝试创建一个单一报告,但具有多个页面和多个图形/数据表等(而不是像这种情况下创建多个报告)。我在.Rmd文件中包含了一个“for”循环,循环遍历多个对象并打印它。然而,我得到了多个报告,而不是一个具有多个页面的单一报告。 - Narendra Sahu
对于像我这样不太熟练的人,请注意以下提示,如果你有问题:确保你的 Report.Rmd 文档设置了正确的目录。这可以通过 setwd("C://your_path") 实现。然后,按照说明将第一个代码块另存为 .Rmd 文件。接下来,为了获得一个脚本,将代码块 2 和 3 另存到同一文件夹中(例如 run.R)。我无法将 run.R 命名为 run.Rmd 以便使用 knitr,但单独运行代码块是可以工作的。也许这是与工作目录有关的问题? - Martin
@NarendraSahu 或许可以使用 Bookdown 全局参数? - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接