【问题标题】:Customize Automated R Markdown Reports自定义自动 R Markdown 报告
【发布时间】:2019-12-24 01:39:24
【问题描述】:

我正在尝试使用 RMarkdown 通过培训中心创建自动健身测试报告。我正在使用相同的数据框结构和类似的代码构建我在主题 here 上提出的上一个问题。

我想基于 hub 稍微定制每个 RMarkdown 报告,同时仍然允许它成为一个自动化过程(即 1 个脚本 + 1 个 .rmd)。例如,所有集线器都有大跳图,但对于 A,我想要一个大跳图和一个 10m 冲刺图。

我曾尝试在 YAML 和渲染函数中使用参数,但到目前为止还没有运气。

样本数据

         Date  Athlete       Test    Average Hub
1  2019-06-03    Athlete1 Broad_Jump 175.000000 A
2  2019-06-10    Athlete1 Broad_Jump 187.000000 A
3  2019-06-10    Athlete2 Broad_Jump 200.666667 B
4  2019-06-10 Athlete3 10m_Sprint   1.831333 B
5  2019-06-10    Athlete2 10m_Sprint   2.026667 B
6  2019-06-17    Athlete1 Broad_Jump 191.500000 A
7  2019-06-17    Athlete2 Broad_Jump 200.666667 B
8  2019-06-17 Athlete3 10m_Sprint   1.803667 B
9  2019-06-17    Athlete2 10m_Sprint   2.090000 B
10 2019-06-24    Athlete1 Broad_Jump 192.000000 A

R 脚本

library(rmarkdown)
library(knitr)
library(dplyr)
library(ggplot2)

WT <- read.csv("WT.csv")

WT_10m <- WT %>%
  filter(Test == "10m_Sprint") %>%
  select(Date, Athlete, Hub, Average)

plot2 <- ggplot(WT_10m, aes(x=Date, y=Average))+
  geom_point()

for (hub in unique(WT$Hub)){
  subgroup <- subset(WT, Hub == hub)
  render(
    input = "Hub_Test.rmd",
    params = list("plot2"=plot2),
    output_file = paste0('report.', hub, '.pdf'))

.Rmd 文件

---
title: "WT Monitoring: Hub"
output: pdf_document
params:
  plot2: plot2
  hub:
    label: "hub"
    value: A
    choices: [A, B]
---


```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

library(rmarkdown)
library(knitr)
library(dplyr)
library(ggplot2)

WT <- read.csv("WT.csv")

subgroup <- subset(WT, Hub == hub)

subgroup_Broad <- subgroup %>%
  filter(Test == "Broad_Jump") %>%
  select(Date, Athlete, Hub, Average)


ggplot(subgroup_Broad, aes(x=Date, y= Average)) +
  geom_point()


params$plot2

我不确定是否使用参数、渲染文件或其他方法来完成此任务。有几个集线器和测试,所以我尽量避免为每个集线器使用单独的 Rmarkdown 模板。

【问题讨论】:

    标签: r automation report r-markdown render


    【解决方案1】:

    所以我不知道这是否是最有效的解决方案(可能不是)。此外,我还不清楚你想要运行什么代码,所以在下面你会发现一些一般性的东西,你必须根据你的具体情况进行一些调整。

    如果我理解正确,您希望使用稍微不同的设置至少运行两次降价。我要做的确实是使用参数并创建一个指定渲染的函数。我认为你几乎是对的,但我不确定你的标签、价值和选择部分。所以这就是我要改变的事情。

    因此,在降价中,您需要使用默认设置指定参数(我还包括标题,因为我认为每个报告都应该有自己的标题)。我在这里假设你想要一个 html 文档,但你当然可以调整它

    author: "Author"
    date: "Dec 24, 2019"
    params: 
        hub: "B"
        title: "Some basic title"
    output: html_document
    

    在指定作者、日期、参数和输出后,您应该输入的第一件事是:

    ---
    title: `r params$title`
    ---
    

    需要包含破折号。这将为您的文档提供您想要的特定标题。在此之后,你可以对代码做任何你想做的事情,直到你达到你想要包含 plot2(sprint 图)的点。我会做类似的事情:

    if(params$hub == "A"){
    YOUR PLOT CODE FOR PLOT 2
    }
    

    因此,仅当集线器的参数为 A 时才会运行该图(或者如果您实际上想要它的倍数而不是使用 %in% c("A","") )。 如果需要,您可以在此之后添加更多代码。

    比在脚本中你可以使用渲染函数来改变参数。我把它放在我自己的函数中:同样,如果需要,您可以更改函数的名称,并确保检查 .html 是否与您的降价文档输出匹配。我使用这个用户定义的函数,所以我可以通过渲染运行多个输入并获得不同的输出。

    render_html_fun <- function(hub_in){
      rmarkdown::render('FILE LOCATION WHERE YOU SAVE THE RMD FILE.Rmd',
                        output_file = paste0('SOME TITLE', hub_in, "_", Sys.Date(), '.html'),
                        params = list(hub = hub_in,
                                      title = paste0("SOME BASIC TITLE", hub_in)))
    }
    

    所以基本上你的针织文档的标题将与基本标题+中心一起保存,这样你就可以事先知道你正在打开哪个文件。 所以接下来在你的 scipt 中要做的就是将你的集线器一个一个地放入函数中。因此,您将分别获得每个中心的文档。

    hubs_input <- c("B", "A")
    library(purrr)
    walk(hubs_input, render_html_fun)
    

    就我个人而言,我使用 c() 函数并手动指定尺寸,以便

    1 您不必加载数据两次(一次在脚本中,一次在降价中),尤其是当您的数据很大时,不建议加载两次数据

    2 如果您不想,您可以选择不运行特定级别的脚本。

    当然,如果您愿意,您也可以将 c() 部分替换为您的 unique(WT$Hub) 部分。

    编辑:我还发现website 非常有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      相关资源
      最近更新 更多