web-dev-qa-db-fra.com

Comment envoyer le rapport de démarque R dans le corps de l'e-mail?

mise à jour: réponse de Brandon Bertelsen :

La réponse de Brandon produit la sortie suivante. Il ne produit pas de belles tables ni ne met en évidence le code comme le fait Rstudio, et il se bloque sur certains fichiers html avec unicode, donc je ne l'utilise pas pour automatiser mes rapports par e-mail.

Mon approche actuelle consiste à compiler avec Rstudio en html, ouvrir le document html en chrome, puis copier et coller le document html dans gmail. Cela fonctionne assez bien, voir cet Gist: https://Gist.github.com/nelsonauner/a68b5a808c232ce7817e

enter image description here

Question d'origine:

Existe-t-il un moyen simple d'envoyer un document de démarque R en tant que corps d'un e-mail, de sorte que le corps de l'e-mail ressemble aux résultats de l'utilisation du "Knit HTML" de Rstudio?

Voici un exemple reproductible de base utilisant knitr, rmarkdown et mailR

exemple.Rmd

---
title: "Report for email"
output: 
  html_document: 
    self_contained: no
---

```{r}
summary(cars)  
```

You can also embed plots, for example:

```{r, echo=FALSE}
plot(cars)
```

J'utilise self_contained: no puisque l'encodage base64 par défaut ne fonctionne pas avec mailR (recommandé par Yihui dans this SO post )

knit_and_send.R

# compile using rmarkdown
library(rmarkdown)
rmarkdown::render("example.Rmd")

library(mailR)

send.mail(from = "[email protected]",
          to = "[email protected]",
          subject = "R Markdown Report - rmarkdown",
          html = T,
          inline = T,
          body = "example.html",
          smtp = list(Host.name = "smtp.gmail.com", port = 465, user.name = "me", passwd = "password", ssl = T),
          authenticate = T,
          send = T)

#compile using knitr
library(knitr)
knit2html("example.Rmd",options="")

send.mail(from = "[email protected]",
          to = "[email protected]",
          subject = "R Markdown Report - knitr",
          html = T,
          inline = T,
          body = "example.html",
          smtp = list(Host.name = "smtp.gmail.com", port = 465, user.name = "me", passwd = "password", ssl = T),
          authenticate = T,
          send = T)

Les deux e-mails ont bien été envoyés.

L'e-mail tricoté ressemble à ceci:


knitted and emailed report


et l'e-mail rmarkdown ressemble à ceci. (Notez qu'il comprend également un tas de fichiers javascript - je pense que je devrais écrire des scripts pour les supprimer)


enter image description here


Mais aucun d'eux n'a l'air aussi agréable que le rapport produit à partir de "Knit as HTML" de Rstudio, qui ressemble à ceci:

enter image description here

Aucune suggestion?

Je pense qu'un vrai correctif pourrait impliquer un certain post-traitement du fichier html qui incorpore le style css d'une manière conviviale par e-mail tout en supprimant les fichiers javascript.

Pour l'instant, je vais utiliser le package knitr.

Veuillez me faire savoir si quelque chose n'est pas clair et je vais améliorer la question.

Pertinents SO posts:

Dans R, existe-t-il un moyen d'envoyer un fichier html RMarkdown v2 comme le corps d'un e-mail

mailR: comment envoyer des documents rmarkdown en tant que corps dans un e-mail?

49
Nelson

Le principal problème est que les lecteurs de messagerie suppriment votre code et n'autorisent pas les importations externes. Pour obtenir une prise en charge CSS de base, la meilleure stratégie consiste à utiliser des styles en ligne pour avoir une vue cohérente. Nous y reviendrons dans une minute.

Tout d'abord, vous devez configurer votre document Rmd un peu différemment afin d'exclure tous les fichiers javascript supplémentaires. theme, highlight et mathjax doivent tous être null. Remarquez, j'ai ajouté un attribut css.

---
title: "Report for email"
output: 
  html_document: 
    self_contained: no
    theme: null
    highlight: null
    mathjax: null
    css: ink.css
---

```{r}
summary(cars)  
```

You can also embed plots, for example:

```{r, echo=FALSE}
plot(cars)
```

ink.css vient de http://foundation.zurb.com/emails . Je recommande d'utiliser ceci comme thème de base.

Il existe un certain nombre de scripts différents que vous pouvez utiliser pour "inline" votre css (c'est un verbe), j'ai inclus des instructions ici pour utiliser premailer a python Malheureusement, aucun d'entre eux ne prendra en charge des CSS très compliqués comme le bootstrap. Vous n'aurez donc qu'à vous contenter de votre propre style construit à l'aide d'encre ou de quoi que ce soit comme base.

Vous devrez peut-être installer certains éléments, pour moi sur Ubuntu:

Sudo apt-get install python-pip libxslt1-dev
Sudo pip install premailer

Maintenant, vous pouvez faire quelque chose comme ça.

library(rmarkdown)
library(mailR)
rmarkdown::render("example.Rmd")
system("python -m premailer -f example.html -o output.html")


send.mail(
  from = "[email protected]",
  to = "[email protected]",
  subject = "R Markdown Report - rmarkdown",
  html = T,
  inline = T,
  body = "output.html",
  smtp = list(
     Host.name = "smtp.gmail.com", 
     port = 465, 
     user.name = "me",    
     passwd = "password", 
     ssl = T),
  authenticate = T,
  send = T)

AVERTISSEMENT: votre kilométrage peut varier énormément en fonction du lecteur de messagerie qui est votre cible

13
Brandon Bertelsen