【问题标题】:How to send R markdown report in body of email?如何在电子邮件正文中发送 R 降价报告?
【发布时间】:2016-03-17 18:30:02
【问题描述】:

更新:Brandon Bertelsen 的回答:

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

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

原问题:

是否有一种简单的方法可以将 R markdown 文档作为电子邮件正文发送,以使电子邮件正文看起来类似于使用 Rstudio 的“Knit HTML”的结果?

这是一个使用 knitr、rmarkdown 和 mailR 的基本可重现示例

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)

两封邮件都发送成功。

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



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



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

有什么建议吗?

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

现在,我将使用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?

【问题讨论】:

  • 看起来我们都在寻找如何做到这一点但没有成功......你成功了吗?
  • 不!我目前的做法是在 Rstudio 中编译为 markdown,打开输出的 html 文件,crtl-C crtl-P 到电子邮件中,然后发送:( Noam ross 在这里建议一个包:twitter.com/noamross/status/676760045187694596。仍然希望得到@987654330 的关注@
  • 好的,我发布了您帖子的另一个扩展,用于交互式图表...您的复制粘贴甚至无法正常工作。谢谢
  • @statquant 你能分享问题的链接吗?您无法通过电子邮件发送交互式图表(因为电子邮件是静态的)所以问题不仅仅是复制/粘贴

标签: r email knitr r-markdown


【解决方案1】:

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

首先,您必须稍微不同地设置您的 Rmd 文档,以便它排除所有额外的 javascript 文件。 theme、highlight 和 mathjax 都应该是 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)

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

【讨论】:

  • 感谢您的回答,布兰登。我发现在 chrome 中打开原始 html 文件,然后 Crtl-C Crtl-P 将其粘贴到电子邮件中比 premailer 保留更多的原始语法。好奇什么程序(gmail?)在我使用复制粘贴时内联 CSS
  • 这确实是一个奇怪的问题。当您能够看到格式时,我很想看看您在 gmail 中获得的来源。如果您单击消息左上角的下拉菜单,您可以单击“显示原始”,它将显示多部分消息的整个文本。如果你有时间的话,把它放在一个要点里。但请记住 - 这只是 gmail,不能保证人们只会在 gmail 中查看您的工作!我推荐使用 ink,因为它可以覆盖更广泛的电子邮件客户群。
  • 这是电子邮件的来源,以及创建它的 R/html 代码:gist.github.com/nelsonauner/a68b5a808c232ce7817e。兼容性很好,但在工作中,我们都使用 gmail,所以即使是 gmail 特定的解决方案也会为我省去很多麻烦。
  • 我将支持您的答案,并留下未回答的问题,希望有人会用一种可以保留表格格式并且不会在 unicode 上崩溃的解决方案来回答。如果一两周后没有人回答,我会接受这个——听起来可以吗?
  • 我刚刚编写了一个用于在 HTML 代码中内联 CSS 样式的包,这可能在这里有用:github.com/noamross/juicer
【解决方案2】:

2019 年 12 月更新

R Studio 发布了一个电子邮件专用包blastula。我发现这在为电子邮件内联 CSS 方面做得很好。

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

【讨论】:

猜你喜欢
  • 2013-02-18
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2012-05-07
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多