如何生成和编制 .Rmd 报告的个性化版本?
How can I generate and knit personalized versions of an .Rmd report?
我创建了一份报告 PerfReport.Rmd,将一个人的表现与一大群人的表现进行比较。我有数百人应该收到这份报告的个性化版本,将他们自己的表现与大组进行比较。
我看到的障碍是:
1. 我需要每个文件名都包含人名。
2. 每个文件都有因人而异的计算。
这里有一个例子.Rmd
---
title: "Course Success"
output:
html_document: flexdashboard::flex_dashboard
pdf_document: default
---
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(dplyr)
library(plotly)
```
```{r comp, echo=FALSE, message=FALSE,warning=FALSE}
df<-data.frame(Person=c('a','a','a','a','a','b','b','b','b','b','c','c','c','c','c','d','d','d','d','d'),
Success=c(1,0,1,1,0,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1),
Valid=c(1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1))
testperson<-'b'
comparison<-df%>%
transmute(Your_Rate=sum(Success[Person==testperson])/sum(Valid[Person==testperson]),
Baseline=sum(Success[Person!=testperson])/sum(Valid[Person!=testperson]))%>%
distinct(Your_Rate,.keep_all = TRUE)
plot_ly(comparison,y=~Your_Rate, type='bar')%>%
add_trace(y=~Baseline)
```
按照我的结构,.Rmd 中的一个变量定义了进行计算的人,我处理文件名的唯一方法是手动保存一个文件,其中包含之前的人名针织。
我猜想如何做到这一点:
- 生成 .Rmd 文件并附加每个人的姓名(即 PerfReport_a.Rmd、PerfReport_b.Rmd)并更改每个文件中的 testperson 变量。
- 运行 将这些 .Rmd 文件编织成一组 html 文件的脚本。
如果我对这里的一般步骤是正确的,我将第 2 步覆盖在一个 .R 文件中,该文件编织目录中的每个 .Rmd 文件。
files<-list.files("E:/Dashboards/",pattern = "[.]Rmd$")
files2<-as.data.frame(files)
files3<-files2%>%
mutate(filenow=paste0("E:/Dashboards/",files))
files4<-files3$filenow
for (f in files4) rmarkdown::render(f)
任何帮助生成具有 testperson
的调整值的 .Rmd 文件的方法将不胜感激。如果有更好的方法从一个单一的主 .Rmd 到数百个我想要制作的个性化 .html 仪表板,我也很想学习这种方法!
提前致谢。
您可以使用 yaml 参数 params
来解决这个问题。你需要
- 一个模板(template.Rmd)
- 脚本 运行 模板 (script.R)
这是一个简单的小例子:
template.Rmd
---
title: no title
author: Roman
date: "`r Sys.Date()`"
params:
testperson: NA
---
```{r}
print(params$testperson)
```
```{r}
sessionInfo()
```
script.R
library(rmarkdown)
persons <- c("person1", "person2", "person3")
for (person in persons) {
rmarkdown::render(input = "template.Rmd",
output_file = sprintf("%s_report.html", person),
params = list(testperson = person)
)
}
这应该会用 personX_report.html
文件填充您的工作文件夹(见下面的屏幕截图)。
我创建了一份报告 PerfReport.Rmd,将一个人的表现与一大群人的表现进行比较。我有数百人应该收到这份报告的个性化版本,将他们自己的表现与大组进行比较。
我看到的障碍是: 1. 我需要每个文件名都包含人名。 2. 每个文件都有因人而异的计算。
这里有一个例子.Rmd
---
title: "Course Success"
output:
html_document: flexdashboard::flex_dashboard
pdf_document: default
---
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(dplyr)
library(plotly)
```
```{r comp, echo=FALSE, message=FALSE,warning=FALSE}
df<-data.frame(Person=c('a','a','a','a','a','b','b','b','b','b','c','c','c','c','c','d','d','d','d','d'),
Success=c(1,0,1,1,0,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1),
Valid=c(1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1))
testperson<-'b'
comparison<-df%>%
transmute(Your_Rate=sum(Success[Person==testperson])/sum(Valid[Person==testperson]),
Baseline=sum(Success[Person!=testperson])/sum(Valid[Person!=testperson]))%>%
distinct(Your_Rate,.keep_all = TRUE)
plot_ly(comparison,y=~Your_Rate, type='bar')%>%
add_trace(y=~Baseline)
```
按照我的结构,.Rmd 中的一个变量定义了进行计算的人,我处理文件名的唯一方法是手动保存一个文件,其中包含之前的人名针织。
我猜想如何做到这一点:
- 生成 .Rmd 文件并附加每个人的姓名(即 PerfReport_a.Rmd、PerfReport_b.Rmd)并更改每个文件中的 testperson 变量。
- 运行 将这些 .Rmd 文件编织成一组 html 文件的脚本。
如果我对这里的一般步骤是正确的,我将第 2 步覆盖在一个 .R 文件中,该文件编织目录中的每个 .Rmd 文件。
files<-list.files("E:/Dashboards/",pattern = "[.]Rmd$")
files2<-as.data.frame(files)
files3<-files2%>%
mutate(filenow=paste0("E:/Dashboards/",files))
files4<-files3$filenow
for (f in files4) rmarkdown::render(f)
任何帮助生成具有 testperson
的调整值的 .Rmd 文件的方法将不胜感激。如果有更好的方法从一个单一的主 .Rmd 到数百个我想要制作的个性化 .html 仪表板,我也很想学习这种方法!
提前致谢。
您可以使用 yaml 参数 params
来解决这个问题。你需要
- 一个模板(template.Rmd)
- 脚本 运行 模板 (script.R)
这是一个简单的小例子:
template.Rmd
---
title: no title
author: Roman
date: "`r Sys.Date()`"
params:
testperson: NA
---
```{r}
print(params$testperson)
```
```{r}
sessionInfo()
```
script.R
library(rmarkdown)
persons <- c("person1", "person2", "person3")
for (person in persons) {
rmarkdown::render(input = "template.Rmd",
output_file = sprintf("%s_report.html", person),
params = list(testperson = person)
)
}
这应该会用 personX_report.html
文件填充您的工作文件夹(见下面的屏幕截图)。