Добавление нескольких таблиц в электронную почту с помощью mailR (send.mail) - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть 3 кадра данных, например, df1, df2, df3, и я хочу отправить их по электронной почте в виде 3-х отдельных таблиц с некоторым пробелом между ними.

В настоящее время я могу отправить 1 кадр данных в виде таблицы с ниже код

library("mailR")


df1 <- read.csv('Adhoc/temp.csv')

final1 <- print(xtable(df1,caption = "Report"), type = "html", include.rownames = FALSE,
            caption.placement = getOption("xtable.caption.placement", "top"),
            html.table.attributes = getOption("xtable.html.table.attributes","border=1"))


date_of_report<- Sys.Date() - 1

    send.mail(from = "no-reply@abc.com",
              to = c('xyz.pqr@abc.com'
              ),
              subject = paste('Report', date_of_report, sep=' '),
              body = final1,
              html = TRUE,
              smtp = list(host.name = "aspmx.l.google.com", port = 25),
              authenticate = FALSE,
              send = TRUE,
              debug=TRUE)

Мне нужна помощь, чтобы я мог отправить все кадры данных в одном электронном письме. В настоящее время я отправляю 3 таких письма.

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Рекомендуется не проверено Решение: paste несколько предварительно отформатированных таблиц:

final1 <- print(xtable(df1,caption = "Report"), type = "html", include.rownames = FALSE,
        caption.placement = getOption("xtable.caption.placement", "top"),
        html.table.attributes = getOption("xtable.html.table.attributes","border=1"))

final2 <- print(xtable(df2,caption = "Report2"), type = "html", include.rownames = FALSE,
        caption.placement = getOption("xtable.caption.placement", "top"),
        html.table.attributes = getOption("xtable.html.table.attributes","border=1"))

final3 <- print(xtable(df3,caption = "Report3"), type = "html", include.rownames = FALSE,
        caption.placement = getOption("xtable.caption.placement", "top"),
        html.table.attributes = getOption("xtable.html.table.attributes","border=1"))


final <- paste(final1, final2, final3, sep="\n")

date_of_report<- Sys.Date() - 1

send.mail(from = "no-reply@abc.com",
          to = c('xyz.pqr@abc.com'
          ),
          subject = paste('Report', date_of_report, sep=' '),
          body = final,
          html = TRUE,
          smtp = list(host.name = "aspmx.l.google.com", port = 25),
          authenticate = FALSE,
          send = TRUE,
          debug=TRUE)
0 голосов
/ 22 февраля 2020

Я думаю, здесь есть смысл определить функцию. И затем есть пара вещей, которые я бы изменил для будущей расширяемости.

library(xtable) # This is required for the xtable function and print method
library(mailR)

# Read the data.frames into a list. This makes it easier to add/remove tables later
dfs <- list(
  `Report 1` = data.frame(letter = LETTERS[seq_len(5L)],
                          number = seq_len(5L),
                          stringsAsFactors = FALSE
                          ),
  `Report 2` = data.frame(letter = letters[6L + seq_len(5L)],
                          number = 6L + seq_len(5L),
                          stringsAsFactors = FALSE
                          ),
  `Report 3` = data.frame(letter = LETTERS[20L:16L],
                          number = 20L:16L,
                          stringsAsFactors = FALSE)
  )

Теперь нам нужно определить функцию, которая будет форматировать одну из наших таблиц. Я просто называю это make_xtable, и я даю ему два аргумента, первый - это data.frame, а второй - строка, которая будет использоваться в качестве заголовка.

make_xtable <- function(df, caption) {
  print(
    xtable(df, caption = caption), 
    type = "html", 
    include.rownames = FALSE,
    caption.placement = getOption("xtable.caption.placement", "top"),
    html.table.attributes = getOption("xtable.html.table.attributes", "border=1"),
    print.results = FALSE # This suppresses the results from printing to the console
    )
}

До сих пор мы загрузили наши данные и определили процесс создания таблиц из заданного data.frame и строки заголовка, но нам все же нужно на самом деле выполнить каждую из наших таблиц в процессе. Здесь пригодится помещение наших data.frames в список. Семейство apply функций поможет нам запустить функцию для каждого элемента нашего списка, а затем paste0 позволит нам объединить результирующий символьный вектор в символьный объект длиной 1.

email_body <-
  paste0(
    mapply(
      make_xtable,
      dfs, # The list of data.frames containing our data
      names(dfs) # Names attribute of the list of data.frames
      ),
    collapse = "<br \>" # Concatenate using an HTML newline as a separator
    )

Затем используйте email_body в качестве аргумента body в функции send.mail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...