如何在电子邮件正文中发送R降价报告?

时间:2015-12-11 18:41:57

标签: r email knitr r-markdown

更新:Brandon Bertelsen的回答

Brandon的回答产生以下输出。 它不会像Rstudio那样产生漂亮的表格或突出显示代码,并且它会在一些带有unicode的html文件上崩溃,因此我不会使用它来自动化我的电子邮件报告。

我目前的方法是使用Rstudio编译为html,在chrome中打开html文档,然后将html文档复制并粘贴到gmail中。这非常有效,请参阅此要点:https://gist.github.com/nelsonauner/a68b5a808c232ce7817e

enter image description here

原始问题:

是否有一种简单的方法可以将R降价文档作为电子邮件正文发送,以便电子邮件的正文与使用Rstudio的“编织HTML”的结果类似?

以下是使用knitrrmarkdownmailR

的基本可重现示例

example.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)
```

我正在使用self_contained: no,因为默认的base64编码不适用于mailR(Yihui在this SO post推荐)

knit_and_send.R

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

library(mailR)

send.mail(from = "me@gmail.com",
          to = "me@gmail.com",
          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 = "me@gmail.com",
          to = "me@gmail.com",
          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)

两封电子邮件都成功发送。

针织电子邮件看起来像这样:

knitted and emailed report

并且rmarkdown电子邮件看起来像这样。 (请注意,它还包含一堆javascript文件 - 我想我必须编写一些脚本来删除它们)

enter image description here

但它们都不像Rstudio的“Knit as HTML”报告那样好看,它看起来像这样:

enter image description here

有什么建议吗?

我认为真正的修复可能涉及对html文件进行一些后处理,该文件在删除javascript文件时以电子邮件友好的方式包含css样式。

现在,我将使用knitr包。

如果问题不清楚,请告诉我,我会改进这个问题。

相关的SO帖子:

In R is there any way to send an RMarkdown v2 html file as the body of an email

mailR: how to send rmarkdown documents as body in email?

2 个答案:

答案 0 :(得分:13)

主要问题是电子邮件阅读器会删除您的代码并且不允许外部导入。要获得基本的CSS支持,最好的策略是使用内联样式来获得一致的视图。我们将在一分钟内回过头来。

首先,您必须以不同的方式设置Rmd文档,以便排除所有额外的javascript文件。 themehighlightmathjax都应为null。请注意,我添加了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来自http://foundation.zurb.com/emails。我建议使用它作为基本主题。

您可以使用许多不同的脚本来进行内联"你的CSS(这是一个动词),我在这里包含了使用premailer python包的说明。不幸的是,它们都不会像bootstrap那样支持非常复杂的CSS。因此,您只需要使用墨水或其他任何基础构建自己的风格。

你可能需要在Ubuntu上安装一些元素:

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

现在,你可以做这样的事情。

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


send.mail(
  from = "me@gmail.com",
  to = "me@gmail.com",
  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)

免责声明:根据您的目标电子邮件阅读器,您的里程可能会有很大差异

答案 1 :(得分:1)

2019年12月更新

R Studio已发布特定于电子邮件的软件包blastula。我发现这在为电子邮件内联CSS方面做得很好。

https://github.com/rich-iannone/blastula