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

Eri*_*ric 5 r sendmailr pander

我正在使用'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
)
Run Code Online (Sandbox Code Playgroud)

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

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

描述的问题

dar*_*zig 6

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

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

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>'))
Run Code Online (Sandbox Code Playgroud)

由于存在错误sendmailR,我们必须覆盖Content-typeHTML:

msg_content[["headers"]][["Content-Type"]] <- "text/html"
Run Code Online (Sandbox Code Playgroud)

现在可以通过您在示例中使用的注释发送,从而导致:

HTML邮件中的Pander markdown表

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