Chapter 7 Producción masiva de documentos
7.1 Mail merge
El conocido mail merge es una técnica que se creo originalmente para enviar e-mails masivos con base en una plantilla y una lista de destinatarios. Sin embargo, también se ha empleado para la creación de documentos, por ejemplo oficios, recordatorios impresos, recibos de servicios etc.
Para aprender a usarlo en Office es necesario contar con excel y con Word. Los pasos son los siguientes:
Crea un machote donde los cambos a vaciar los vas a poner en este formato: <<campo1>>.
Crea una hoja de excel con la información que te interesa vaciar de manera ordenada y con el titulo de la columna igual a como especificaste el campo en el machote.
Seleccionar la pestaña de Mailings y dar clic en Select Recipients y seleccionar Use Existing List
Localizamos el archivo de Excel donde tenemos toda la información necesaria.
Seleccionar la ubicación de la información en este caso se tiene en la primera pestaña del documento y damos clic en OK.
Seleccionamos Insert Merge Field para colocar la opción o columna que deseamos en el documento
Para finalizar en la ventana se mostrara el resultado del merge y nos dará las opciones de editar individualmente, imprimir o enviar por correo
7.2 Mail merge en R markdown
La ventaja de hacerlo en word es que es muy intuitivo. La desventaja es que el formato es limitado y no podemos aprovechar las herramientas que hemos aprendido en el curso.
En R markdown se puede hacer lo mismo de manera más eficiente y libre sin embargo se requiere conocer un poco de las estructuras de datos en R y los for loops
7.2.1 Datos en R
Podemos importar datos de diferentes maneras: por ejemplo, desde una URL, desde nuestros archivos locales o bien desde algún paquete. Dependiendo el tipo de extensión de la base (es decir .csv, .json .xls, .txt, etc) vamos a necesitar diferentes paquetes. A continuación te muestro como importar algunos datos.
#asumiendo que en nuestro repositorio hay una base de datos en formato csv
<-read.csv("datos.csv") data
Otra manera es crear la base de datos, directamente desde R. Para eso usaremos las ventajas que tiene el lenguaje en cuanto a definición de vectores y data.frames.
Se define un vector con la letra c y entre parentesis los elementos.Recordemos que si son strings deben ir entre comillas. Asimismo, se define una base de datos con el comando data.frame y entre parentesis los vectores.
library(kableExtra)
<-c("Maestro", "Doctor","Licenciado","Maestro")
titulo<-c("del ITAM","de la UAM","de la UNAM","del TEC")
institucion<-c("Hugo CT", "Diego Crespi","Eduardo Lara","Marco Ramos")
nombres<-c("5,000 MXN", "500,000 MXN","20,000 USD","1,000 MXN")
adeudo<-data.frame(titulo,institucion,nombres,adeudo)
datakable(data, booktabs=T)
titulo | institucion | nombres | adeudo |
---|---|---|---|
Maestro | del ITAM | Hugo CT | 5,000 MXN |
Doctor | de la UAM | Diego Crespi | 500,000 MXN |
Licenciado | de la UNAM | Eduardo Lara | 20,000 USD |
Maestro | del TEC | Marco Ramos | 1,000 MXN |
Ahora, para acceder a una columna en específico de la base de datos se usa el singo de $:
$nombres data
## [1] "Hugo CT" "Diego Crespi" "Eduardo Lara" "Marco Ramos"
Finalmente, para acceder a un dato de manera individual, debemos indicar la columna y posteriormente entre square brackets.
#accedemos al nombre 1
$nombres[1] data
## [1] "Hugo CT"
#accedemos al nombre 2
$nombres[2] data
## [1] "Diego Crespi"
#accedemos al adeudo 2
$adeudo[2] data
## [1] "500,000 MXN"
7.2.2 Plantillas parametrizadas
En las plantillas paramétrizadas podemos sustituir cualquier paramétro de acuerdo al valor que le asignemos a una variable.
Por ejemplo siempre podemos acceder a una miniconsola de r si usamos los acentos alrevez y ponemos r. En seguida, después de un espacio ponemos cualquier comando que usemos en lenguaje R. De esta manera podemos acceder a la información que accedimos en la sección pasada si ponemos:
`r data$nombres[1]`
`r data$nombres[2]`
`r data$adeudo[4]`
se renderiza como
Hugo CT
Diego Crespi
1,000 MXN
De esta manera podemos usar todo lo que hemos visto: markdown, latex, ambientes, github y agregar estos comandos para crear una plantilla.
7.2.3 for loops
La última cosa, que hay que saber es como hacer un loop.
for (i in (1:10))
print(i)} {
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
for (i in (1:nrow(data)))
print(data$titulo[i])} {
## [1] "Maestro"
## [1] "Doctor"
## [1] "Licenciado"
## [1] "Maestro"
Puedo crear for loops de basicamente cualquir lista y cualquier comando. En este sentido voy a crear un for loop para renderizar archivos rmd. Supongamos que tengo un archivo RMD llamado “plantilla.Rmd” y que solo contiene lo siguiente:
---
: "Mensaje urgente para `r data$nombres[i]`"
title: pdf_document
output---
`r data$titulo[i]` `r data$institucion[i]` `r data$nombres[i]`, se le informa que debido a la falta de pago ante su adeudo de `r data$adeudo[i]` se le congelaran sus cuentas bancarias.
Estimado
Esperemos nos llame pronto para brindarle más información sobre su situación financiera.
#creo la base de datos
<-c("Maestro", "Doctor","Licenciado","Maestro")
titulo<-c("del ITAM","de la UAM","de la UNAM","del TEC")
institucion<-c("Hugo CT", "Diego Crespi","Eduardo Lara","Marco Ramos")
nombres<-c("5,000 MXN", "500,000 MXN","20,000 USD","1,000 MXN")
adeudo<-data.frame(titulo,institucion,nombres,adeudo)
data
#creo el for loop
for (i in 1:nrow(data)) {
::render(
rmarkdown'plantilla.Rmd', output_file = paste0(data$nombres[i], '.pdf')
) }
Este for loop nos creará una impresión en PDF de cada plantilla con la información de la base de dato por fila.