列宽与使用sendmailr从R发送的pander表中的表数据不对齐

时间:2014-12-30 01:01:24

标签: r pander sendmailr

我正在使用'pander'和'sendmailr'软件包在电子邮件正文中发送一个小数据框,而不是附件。我想将它发送到Gmail帐户。

我很接近,但是列标题不会像他们在Rstudio中那样与电子邮件主体中的列本身对齐 - 例如,列标题太宽,无法与它们下面的数据列对齐。

似乎问题在于破折号和空格在各种电子邮件客户端中的压缩方式(我在gmail,yahoo和hotmail中通过网络和OS X Mavericks附带的电子邮件客户端尝试了这一点)。我能够通过转到“首选项”并选中标记为“使用固定宽度字体显示纯文本消息”的框来解决我的OS X电子邮件客户端中的问题,但我希望它可以在多个设备上工作,具有多个许多同事的客户等等,所以我想知道是否有一种不涉及全球电子邮件设置的方式。

以下是重现问题的代码:

library(sendmailR) # for emails from R
library(pander) # for table-formatting that does not require HTML

results <- head(iris)
pander(results) # widths look great so far...
a = pandoc.table.return(results)
strsplit(a, "\n") # widths still look great...

panderOptions('table.split.table', Inf) # show all columns on same line

msg_content <- mime_part(
  pandoc.table.return(results, style = "multiline")
)

# I'm using my own gmail address for email_from and email_to
sendmail(from = email_from,
         to = email_to,
         subject = "test",
         msg = msg_content
)

...收到的电子邮件有上述问题。

接下来,您可以看到一个说明问题的图片:

Described problem

1 个答案:

答案 0 :(得分:6)

纯文本电子邮件和使用降价表的问题在于,电子邮件客户端通常会显示带有非固定字体的文本,并且您必须在所有电子邮件客户端中使用自定义设置来覆盖该文本(就像你使用OS X电子邮件客户端一样)。另一方面,这就是HTML邮件趋势的原因:)

因此,让我们创建一个HTML邮件,并在pre块中包含降价表:

msg_content <- mime_part(paste('<!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"/>
</head>
<body><pre>', paste(pander.return(results, style = "multiline"), collapse = '\n'), '</pre></body>
</html>'))

由于sendmailR中存在错误,我们必须将Content-type覆盖为HTML:

msg_content[["headers"]][["Content-Type"]] <- "text/html"

现在它已准备好通过您在示例中使用的评论发送,从而导致:

Pander markdown table in HTML mail

在任何其他支持HTML的电子邮件客户端中,该表应该看起来同样合适。请注意,如果能够更好地满足您的需求,您也可以使用HTML表而不是降价。