【问题标题】:How to generate multiple files from r script function with knitr如何使用knitr从r脚本函数生成多个文件
【发布时间】:2017-01-07 19:00:56
【问题描述】:

我想从一个 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 工作室中的compile notebook 按钮生成包含所有内容的报告。

我尝试在上述脚本上使用knitr::spin,如下从一个单独的文件:

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

但我只得到一份报告而不是三份。

【问题讨论】:

  • 我为此目的使用了一个参数化的 R 降价文档,然后使用 rmarkdown::render() 的包装器渲染报告迭代参数组合(使用 lapplymapdo 或任何适合的你的幻想)。
  • @Jake Kaupp - 你的意思是我应该在 names(x) 之后插入 rmarkdown::render() 吗?我不明白的是要在降价文档中放什么......困惑......
  • 1.使用 YAML 中的参数创建一个 report.rmd。报告应根据您的选择调用主数据集和参数子集。 2. 使用rmarkdown::render() 通过apply 系列使用您的参数选择呈现report.rmd(或编写一个包装器并使用apply)。我建议阅读rmarkdown::render() 的文档以对所有内容进行排序。
  • @Jake Kaupp。问题是参数发生了变化,所以我有点希望我可以直接从函数输出,而不需要创建 .rmd 文件。
  • 您将创建一个降价文件并通过render()将参数传递给该文件

标签: r


【解决方案1】:

您将创建一个rmarkdown parameterized report。在 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

  2. qsec 与 mpg

  3. wt vs mpg

【讨论】:

  • 感谢您的回答!我不清楚参数化 knitr 报告的一些细节。
  • 我有一个稍微不同的问题。你能帮忙吗?使用您的方法,我尝试创建一个报告,但具有多个带有多个绘图/数据框等的页面(而不是在这种情况下创建多个报告)。我在.Rmd 文件中包含了一个“for”循环,该循环遍历多个对象并打印它。但是,我收到的是多个报告,而不是一个包含多个页面的报告
  • 对于不太熟练的人(比如我自己),如果遇到问题,请注意以下提示: 确保为您的Report.Rmd 设置了正确的目录。这可以通过setwd("C://your_path")) 完成。接下来,将第一个代码块保存为.Rmd 文件,如所述。然后,要有一个脚本,将代码块 2 和 3 保存到同一文件夹中的单独文件(例如run.R)。为了使用 knitr,我无法将 run.R 设置为 run.Rmd,但单独运行代码块可以正常工作。也许这是工作目录的问题?
  • @NarendraSahu 或许使用带全局参数的 book down?
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多