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.Source: http://en.wikipedia.org/wiki/Mail_merge
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.
Input data: meeting_times.csv
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 |
... | ... |
R script: mail_merge_script.R
## 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/")
}
RMarkdown: mail_merge_handout.Rmd
---
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
[![mail_merge_sample](http://citizen-statistician.org/wp-content/uploads/2015/06/mail_merge_sample1-1024x223.png)](http://citizen-statistician.org/wp-content/uploads/2015/06/mail_merge_sample1.png)
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.