使用SendMailR将数据框作为电子邮件正文中的表格发送

时间:2014-02-21 08:31:50

标签: r sendmailr

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

e.g。我尝试了以下语法

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中。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:16)

虽然发送带有sendmailR的HTML邮件并不简单,但可能是基于去年与软件包作者的邮件讨论(再次感谢Olaf Mersmann的帮助) - 简单地覆盖了{{1}标头E.g:

Content-Type

另一方面,HTML没有真正的需要以人类可读的格式呈现表格或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, ...) 。例如有可以将R对象转为降价的data.frame包或我的ascii pkg。快速演示:

pander

如果要将其连接到电子邮件正文,请使用> 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,还有一些有用的style,例如设置小数点,日期格式等:http://rapporter.github.io/pander/

答案 1 :(得分:6)

library&#34; xtable&#34;将有助于将数据框作为表格附加到电子邮件中。试试这个

   library(xtable)

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

答案 2 :(得分:1)

作为 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。