Я думаю, здесь есть смысл определить функцию. И затем есть пара вещей, которые я бы изменил для будущей расширяемости.
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
.