как преобразовать фрейм данных в таблицу для отправки в теле письма

У меня есть этот фрейм данных:

library(sendmailR)
library(pander)

dput(s)
structure(list(Description = c("ServerA", "ServerB", "ServerC", 
"ServerD", "ServerE", "ServerF"), Value = c("2", "2", "100", 
"100", "80", "20")), .Names = c("Description", "Value"), row.names = c(NA, 
6L), class = "data.frame")

Я хотел бы поместить этот фрейм данных в красивую таблицу и отправить его по электронной почте некоторым людям.

Я пробовал это с pandoc, но таблица выглядит очень просто:

 t<-pandoc.table.return(s, caption="Server CPU Utilization")

    from <- "[email protected]"
    to <- c("[email protected]")
    subject <- paste(Sys.time()," Servers CPU utilization")
    body <- t                
    mailControl=list(smtpServer="mailhost.example.net")

    sendmail(from=from,to=to,subject=subject,msg=body,control=mailControl)

Есть ли другой способ отформатировать фрейм данных в красивую таблицу для отправки по электронной почте? Таблица должна быть в теле письма, а не в виде вложения.


person user1471980    schedule 05.05.2014    source источник


Ответы (2)


Что вы имеете в виду под?

стол выглядит очень просто

Вы также можете выбрать другой формат уценки для таблицы, например, передать style = 'grid' в pandoc.table.return, если вам не нравится значение по умолчанию многострочный формат. Или вы имеете в виду, что с немоноширинным шрифтом таблица разваливается / выглядит некрасиво? Результат будет зависеть от почтового клиента, поэтому я бы предпочел отправить HTML-письмо и указать семейство моноширинных шрифтов или визуализировать таблицу в HTML.


Быстрая демонстрация HTML-версии:

  1. Инициализируйте необходимые пакеты R:

    library(sendmailR)
    library(xtable)
    
  2. Создайте тело HTML, объединив статическую часть с динамически созданной таблицей HTML:

    msg <- 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>', print(xtable(s), type = 'html'), ',</body>
    </html>'))
    
  3. Замените content-type с помощью недокументированного взлома:

    msg[["headers"]][["Content-Type"]] <- "text/html"
    
  4. Отправьте письмо указанному получателю с указанной темой:

    from    <- '<[email protected]>'
    to      <- '<[email protected]>'
    subject <- 'HTML table in the body'
    body    <- list(msg)
    sendmail(from, to, subject, body)
    

Объединение версий Markdown и HTML:

msg <- 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><div style="font-family: monospace;">', gsub(' ', '&nbsp;', paste(pander.return(s, caption = "Server CPU Utilization", style = 'grid'), collapse = '<br>')), '</div></body>
</html>'))
msg[["headers"]][["Content-Type"]] <- "text/html"
sendmail(from, to, subject, list(msg))

Уловка здесь заключается в том, чтобы установить font-family в monospace с помощью встроенного CSS, а также заменить все пробелы в документе неразрывными пробелами. Другой (и, скорее, более элегантный) обходной путь может заключаться в установке разметки между pre HTML-тегами:

msg <- 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(s, caption = "Server CPU Utilization", style = 'grid'), collapse = '\n'), '</pre></body>
</html>'))
msg[["headers"]][["Content-Type"]] <- "text/html"
sendmail(from, to, subject, list(msg))
person daroczig    schedule 05.05.2014
comment
Я выполнил точный код, который вы здесь разместили. Я получаю эту ошибку: Ошибка в wait_for (код): Ошибка SMTP: 5.7.1 Невозможно ретранслировать для - person user1471980; 05.05.2014
comment
@ user1471980 вам, возможно, придется передать некоторые пользовательские параметры в control, как вы это делали в исходном примере: mailControl=list(smtpServer="mailhost.example.net") в качестве дополнительного параметра для sendmail. Сообщение об ошибке не имеет ничего общего с содержимым или форматированием тела. - person daroczig; 05.05.2014
comment
Я попытался использовать css в разделе заголовка вышеупомянутого html для форматирования моей таблицы, по какой-то причине, когда я получаю почту, таблица выглядит так же. Можно ли вставить CSS для форматирования таблицы и увидеть его, когда вы получите электронное письмо. Например, цвета фона tr и т. Д. - person user1471980; 07.05.2014
comment
@ user1471980 почтовые клиенты обычно игнорируют CSS в разделе заголовка, и вы должны использовать встроенные стили CSS для раскрашивания ячеек. - person daroczig; 07.05.2014
comment
из приведенного выше кода эта строка создает таблицу: print (xtable (s), type = 'html'). Как бы вы применили встроенный стиль? Быстрый пример действительно был бы очень полезен. - person user1471980; 07.05.2014
comment
@ user1471980 Я не знаю ни одного пакета R, который позволял бы определять встроенный CSS ячеек, но вы можете обновить свои ячейки, например, иметь HTML-тег span, чтобы указать цвет текста и т. д. перед переходом в xtable. Поэтому преобразуйте свои значения в текст и добавьте требуемый HTML-код перед вызовом xtable или примените какое-нибудь регулярное выражение после этого. - person daroczig; 07.05.2014

если dput - это ваш data.frame.

Я использую это.

Date=sys.Date()-1
date2 <- paste("My subject of mail", Date, sep = " - ")
setwd("/xyz")
newdir <- paste("output", Sys.time(), sep = "_")
dir.create(newdir)#, showWarnings = FALSE)
setwd(newdir)

######
mydoc = bsdoc( title = 'my document')
options( "ReporteRs-fontsize" = 8 )
mydoc = addParagraph(mydoc, value = "Hi All, \n\nPlease check attached summary.")
mydoc = addParagraph(mydoc, value = "Summary:")
MyFTable = FlexTable( data = dput, add.rownames = FALSE, header.cell.props = cellProperties( background.color = "#FAEBD7" )
                      , header.par.props = parProperties(text.align = "center" ))
MyFTable = setColumnsColors( MyFTable, j=1, colors = '#F0F8FF' )
MyFTable[ , ] = parProperties( text.align = 'center')
MyFTable = setColumnsColors( MyFTable, j=ncol(dput), colors = '#F0F8FF' )
mydoc = addFlexTable( mydoc, MyFTable )
writeDoc( mydoc, file = "op2.html" )

send.mail(from = "[email protected]",
          to = c("[email protected]"),
          subject = date2,
          body = "op2.html",
          html = TRUE,
          smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "[email protected]", passwd = "xyz@123", ssl = TRUE),
          authenticate = TRUE,
          send = TRUE)

Но я ищу еще лучший вариант для отправки почты, например, как изображение в теле письма или красиво отформатированный / уплотненный.

person Vishan Rana    schedule 02.08.2017