This article is reposted from citizen-statistician.org with the kind permission of Mine Çetinkaya-Rundel.
The term “mail merge” might not be familiar to those who have not worked in an office setting, but here is the Wikipedia definition:
Mail merge is a software operation describing the production of multiple (and potentially large numbers of) documents from a single template form and a structured data source. The letter may be sent out to many “recipients” with small changes, such as a change of address or a change in the greeting line.
The other day I was working on creating personalized handouts for a workshop. That is, each handout contained some standard text (including some R code) and some fields that were personalized for each participant (login information for our RStudio server). I wanted to do this in RMarkdown so that the R code on the handout could be formatted nicely. Googling “rmarkdown mail merge” didn’t yield much (that’s why I’m posting this), but I finally came across this tutorial which called the process “iterative reporting”.
Turns our this is a pretty straightforward task. Below is a very simple minimum working example. You can obviously make your markdown document a lot more complicated. I’m thinking holiday cards made in R…
All relevant files for this example can also be found here.
This is a 20 x 2 csv file, an excerpt is shown below. I got the names from here.
name | meeting_time |
---|---|
Peggy Kallas | 9:00 AM |
Ezra Zanders | 9:15 AM |
Hope Mogan | 9:30 AM |
Nathanael Scully | 9:45 AM |
Mayra Cowley | 10:00 AM |
Ethelene Oglesbee | 10:15 AM |
… | … |
## Packages
library(knitr)
library(rmarkdown)
## Data
personalized_info <- read.csv(file = "meeting_times.csv")
## Loop
for (i in 1:nrow(personalized_info)){
rmarkdown::render(input = "mail_merge_handout.Rmd",
output_format = "pdf_document",
output_file = paste("handout_", i, ".pdf", sep=''),
output_dir = "handouts/")
}
---
output: pdf_document
---
```{r echo=FALSE}
personalized_info <- read.csv("meeting_times.csv", stringsAsFactors = FALSE)
name <- personalized_info$name[i]
time <- personalized_info$meeting_time[i]
```
Dear `r name`,
Your meeting time is `r time`.
See you then!
Save the Rmd file and the R script in the same folder (or specify the path to the Rmd file accordingly in the R script), and then run the R script. This will call the Rmd file within the loop and output 20 PDF files to the handouts directory. Each of these files look something like this
A sample mail
with the name and date field being different in each one.
If you prefer HTML or Word output, you can specify this in the output_format argument in the R script.