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

How to send R markdown report in body of email?

更新:Brandon Bertelsen 的回答

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

我目前的做法是用Rstudio编译成html,打开chrome中的html文档,然后将html文档复制粘贴到gmail中。这很好用,请看这个要点:https://gist.github.com/nelsonauner/a68b5a808c232ce7817e

原问题:

有没有一种简单的方法可以将 R markdown 文档作为电子邮件的正文发送,从而使电子邮件的正文看起来类似于使用 Rstudio 的 "Knit 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(易慧在 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)

两封邮件发送成功。

编织的电子邮件如下所示:



rmarkdown 电子邮件如下所示。 (请注意,它还包含一堆 javascript 文件——我想我必须编写一些脚本才能删除它们)



但是它们看起来都没有 Rstudio 的 "Knit as HTML" 生成的报告好,它看起来像这样:

有什么建议吗?

我认为真正的修复可能涉及对 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?

主要问题是电子邮件 reader 会剥离您的代码并且不允许外部导入。要获得基本的 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。我建议使用它作为您的基本主题。

您可以使用多种不同的脚本来 "inline" 您的 css(这是一个动词),我在此处提供了使用 premailer a [=39] 的说明=] 包。不幸的是,其中 none 将支持非常复杂的 CSS,例如 bootstrap。所以你只需要用墨水或其他任何东西作为你的基础来建立你自己的风格。

你可能需要安装一些元素,对我来说 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)

免责声明:您的里程可能会有很大差异,具体取决于哪个电子邮件 reader 是您的目标

2019 年 12 月更新

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

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