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

标签 r pander sendmailr

我正在使用“pander”和“sendmailr”包在电子邮件正文中发送一个小数据帧,而不是作为附件。我想从 Gmail 帐户发送邮件或将其发送至 Gmail 帐户。

我已经很接近了,但是列标题不会像在 Rstudio 中那样与电子邮件正文中的列本身对齐 - 基本上列标题太宽,无法与下面的数据列对齐。

问题似乎在于各种电子邮件客户端中破折号和空格的压缩方式(我通过网络以及 OS X Mavericks 附带的电子邮件客户端在 gmail、yahoo 和 hotmail 中尝试过此操作)。我能够通过转到“首选项”并选中标有“对纯文本消息使用固定宽度字体”的框来解决 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

最佳答案

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

因此,让我们创建一封 HTML 邮件并将 Markdown 表格包含在 pre block 中:

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 表格而不是 Markdown。

关于r - 列宽与使用 sendmailr 从 R 发送的 pander 表中的表数据不对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27698252/

相关文章:

r - sendmailR : how to handle occasional “Unknown SMTP code” errors

r - 内存分配 R 服务 SQL Server 2016

R/Shiny 图不显示在浏览器中

r - Pander+Knitr : Error when using pander. 列表问题

r - 使用pandoc.table()减少表格的单元格宽度和字体大小

r - 从 R 发送电子邮件 - 当 Windows 中的计划脚本失败时

css - 在 R 中有什么方法可以将 RMarkdown v2 html 文件作为电子邮件的正文发送

r - 在ggplot中,如何将绘图标题设置为使用函数时选择的x变量

r - 如何使用接收器并仍然在 R 中打印消息?

knitr - 在 bookdown :html_document2 中没有使用 pander 的表格编号