自定义自动 R Markdown 报告
Customize Automated R Markdown Reports
我正在尝试使用 RMarkdown 通过培训中心创建自动健身测试报告。我正在使用相同的数据帧结构和类似的代码构建我之前就主题 提出的问题。
我想根据集线器稍微自定义每个 RMarkdown 报告,同时仍然允许它成为一个自动化过程(即 1 个脚本 + 1 个 .rmd)。例如,所有集线器都会有 Broad Jump 图,但对于 A,我想要一个 broad jump 图和一个 10m sprint plot。
我已经尝试在 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 模板。
所以我不知道这是否是最有效的解决方案(可能不是)。此外,我并不完全清楚你想要 运行 的代码,所以在下面你会发现一些一般性的东西,你必须根据你的具体情况稍微调整一下。
如果我理解正确的话,你想 运行 降价至少两次,设置略有不同。我要做的确实是使用参数并创建一个指定渲染的函数。我认为你几乎是对的,但我不确定你的标签、价值和选择部分。所以这就是我要改变的。
因此,在降价中,您需要使用默认设置指定参数(我还包括标题,因为我认为每个报告都应该有自己的标题)。我在这里假设你想要一个 html 文档,但是你可以调整那个 ofcourse
author: "Author"
date: "Dec 24, 2019"
params:
hub: "B"
title: "Some basic title"
output: html_document
在指定作者、日期、parmas 和输出后,您应该输入的第一件事是:
---
title: `r params$title`
---
需要包含破折号。这将为您的文档提供您想要的特定标题。在此之后你可以用代码做任何你想做的事情,直到你到达你想要包含 plot2 (冲刺图)的地步。我会做类似的事情:
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 你不必两次加载数据(一次在脚本中,一次在 markdown 中),尤其是当你的数据很大时,加载两次数据不是首选
2 如果您不想,可以选择不 运行 特定级别的脚本。
当然,如果您愿意,也可以将 c()
部分替换为 unique(WT$Hub)
部分。
编辑:我还发现 website 非常有用。
我正在尝试使用 RMarkdown 通过培训中心创建自动健身测试报告。我正在使用相同的数据帧结构和类似的代码构建我之前就主题
我想根据集线器稍微自定义每个 RMarkdown 报告,同时仍然允许它成为一个自动化过程(即 1 个脚本 + 1 个 .rmd)。例如,所有集线器都会有 Broad Jump 图,但对于 A,我想要一个 broad jump 图和一个 10m sprint plot。
我已经尝试在 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 模板。
所以我不知道这是否是最有效的解决方案(可能不是)。此外,我并不完全清楚你想要 运行 的代码,所以在下面你会发现一些一般性的东西,你必须根据你的具体情况稍微调整一下。
如果我理解正确的话,你想 运行 降价至少两次,设置略有不同。我要做的确实是使用参数并创建一个指定渲染的函数。我认为你几乎是对的,但我不确定你的标签、价值和选择部分。所以这就是我要改变的。
因此,在降价中,您需要使用默认设置指定参数(我还包括标题,因为我认为每个报告都应该有自己的标题)。我在这里假设你想要一个 html 文档,但是你可以调整那个 ofcourse
author: "Author"
date: "Dec 24, 2019"
params:
hub: "B"
title: "Some basic title"
output: html_document
在指定作者、日期、parmas 和输出后,您应该输入的第一件事是:
---
title: `r params$title`
---
需要包含破折号。这将为您的文档提供您想要的特定标题。在此之后你可以用代码做任何你想做的事情,直到你到达你想要包含 plot2 (冲刺图)的地步。我会做类似的事情:
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 你不必两次加载数据(一次在脚本中,一次在 markdown 中),尤其是当你的数据很大时,加载两次数据不是首选
2 如果您不想,可以选择不 运行 特定级别的脚本。
当然,如果您愿意,也可以将 c()
部分替换为 unique(WT$Hub)
部分。
编辑:我还发现 website 非常有用。