【问题标题】:Email dataframe as table in email body with SendMailR使用 SendMailR 将电子邮件数据框作为电子邮件正文中的表格
【发布时间】:2014-02-21 08:31:49
【问题描述】:

我正在尝试使用 SendMailR 发送数据帧。我可以将其作为附件发送,格式相当好。但是我想在电子邮件正文中发送数据框。我尝试了 capture.output、print、sprintf 但甚至无法关闭格式。

例如我尝试了以下语法

for (i in 1:nrow(df)){
 MSG = c(MSG,rownames(df)[1],as.character(unlist(df[i,])),'\n')
} 
MSG = sprintf('%-10s',MSG)
sendmail(from,to,subject,msg = list(MSG,attachment1,attachment2 ... ))

换句话说,我认为可能有必要将我的数据帧转换为带有 /n 和 sprintf('s-10%') 等的格式并将其存储在 MSG 中。有人能指出我正确的方向吗?

【问题讨论】:

  • 我建议你创建一个HTML表格,但我相信你不能用sendmailR发送HTML邮件。
  • 谢谢朱利安。就像编辑一样,我只需要每天通过电子邮件发送工作结果。只要我可以在电子邮件正文中发送内容,我很乐意使用另一个邮件发件人/将数据框更改为数据表/矩阵等。很高兴考虑任何替代方案

标签: r sendmailr


【解决方案1】:

虽然使用sendmailR 发送HTML 邮件并不简单,但可以基于去年与包作者的邮件讨论(再次感谢Olaf Mersmann 的帮助)——只需覆盖Content-Type 标头即可。例如:

msg <- mime_part('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>HTML demo</title>
  <style type="text/css">
  </style>
</head>
<body>
<h1>HTML demo</h1>
</body>
</html>')

## Override content type.
msg[["headers"]][["Content-Type"]] <- "text/html"

from    <- '<foo@example.com>'
to      <- "<bar@example.com>"
subject <- "HTML test"
body    <- list(msg)
sendmail(from, to, subject, body, ...)

另一方面,真正需要 HTML 以人类可读的格式呈现表格或 data.frame。有例如ascii 包或我的 pander pkg 可以将 R 对象转换为降价。快速演示:

> library(pander)
> panderOptions('table.split.table', Inf)
> pander(head(iris, 3))

-------------------------------------------------------------------
 Sepal.Length   Sepal.Width   Petal.Length   Petal.Width   Species 
-------------- ------------- -------------- ------------- ---------
     5.1            3.5           1.4            0.2       setosa  

     4.9             3            1.4            0.2       setosa  

     4.7            3.2           1.3            0.2       setosa  
-------------------------------------------------------------------

> pander(head(iris, 3), style = 'grid')


+----------------+---------------+----------------+---------------+-----------+
|  Sepal.Length  |  Sepal.Width  |  Petal.Length  |  Petal.Width  |  Species  |
+================+===============+================+===============+===========+
|      5.1       |      3.5      |      1.4       |      0.2      |  setosa   |
+----------------+---------------+----------------+---------------+-----------+
|      4.9       |       3       |      1.4       |      0.2      |  setosa   |
+----------------+---------------+----------------+---------------+-----------+
|      4.7       |      3.2      |      1.3       |      0.2      |  setosa   |
+----------------+---------------+----------------+---------------+-----------+

如果您想将其连接到电子邮件正文,请使用pander.return,而不是返回字符向量而不是写入控制台。还有一些其他可用的表styles,还有一些有用的panderOptions,例如设置小数点、日期格式等:http://rapporter.github.io/pander/

【讨论】:

  • 非常感谢您的帮助。我没有设法让 pandoc.return 在电子邮件中工作(格式在 Rstudio 中看起来不错,但在我的电子邮件中却不是......行未对齐)但 html 效果很好。
  • @hjw 也许你可以在添加到电子邮件之前paste(..., collapse = '\n') 来自pander.return 的内容,或者如果发送HTML 邮件,则可以collapse = '&lt;br /&gt;'
  • 函数的正确名称是pander_return
【解决方案2】:

库“xtable”将有助于将数据框作为表格附加到电子邮件中。试试这个

   library(xtable)

   body=print(xtable(dataframe,caption = "Heading for the table"), type="html", caption.placement = "top")

【讨论】:

  • 我在同一个问题上苦苦挣扎。以为有我这种情况的人会得到一些帮助。
【解决方案3】:

作为sendmailR 的替代方案,以下示例使用gt 包将表格转换为HTML,并使用blastula 包发送电子邮件。这两个包都来自 RStudio:blastulagt

library(blastula)
library(gt)

tbl_html <- 
  mtcars %>% 
  gt() %>%
  as_raw_html()

email <-
  compose_email(
    body = blocks(tbl_html)
    )

email %>%
  smtp_send(
    to = 'recipient@email.com',
    from = 'sender@gmail.com',
    subject = "Test email with table",
    credentials = creds_file("gmail_creds")
  )

在第一次使用时设置凭据(在这种情况下使用 gmail 地址):

create_smtp_creds_file(
  file = "gmail_creds",
  user = 'sender@gmail.com',
  provider = "gmail"
)

你也可以在正文中使用markdown。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多