Сетки для таблицы не отображаются в почте при использовании Kable для CSS - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь отправить письмо через mailR, и оно работает нормально. У меня есть фрейм данных, и я хотел раскрасить определенные ячейки кода. Я использовал Kable () для форматирования и получил желаемый результат, и он показывает, как это должно быть в средстве просмотра Rstudio. Но при отправке этого HTML по почте линии сетки не видны.

Я пытался добавить границу в kable_styling ()

#color coding for a data frame
library(knitr)
library(kableExtra)

library(dplyr)

a<-mtcars[1:10, 1:2] %>%
        mutate(
                car = row.names(.),
                mpg = cell_spec(mpg, "html", color = ifelse(mpg > 20,                     "red", "blue")),
                cyl = cell_spec(cyl, "html", color = "white", align = "c", angle = 45, 
                                background = factor(cyl, c(4, 6, 8), 
                                                    c("#666666",     "#999999", "#BBBBBB")))
        ) %>%
        select(car, mpg, cyl) %>%
        kable(format = "html", escape = F) %>%
        kable_styling(c("striped","bordered"), full_width = F)


#=================Send Email
library(mailR)
body_B <- paste("<p>
                ",a,"
                <br> Note: report

                <p>",sep="")


Subject <- paste(Sys.Date(), 'xyz',sep= ":")

send.mail(from = "asdf@gmail.com", 
          to = c("asdf@gmail.com"),
          subject = Subject,        
          body = body_B,
          html = TRUE,
          smtp = list(host.name = "smtp.gmail.com", port = 587,
                      user.name = "#####",
                      passwd = "#####", ssl = T), 
          authenticate = T,
          #attach.files = raw_data,
          send = TRUE)

1 Ответ

0 голосов
/ 01 июня 2019

Когда вы печатаете a, вы используете метод print.kableExtra, но body_B не имеет класса kableExtra, поэтому вы просто будете использовать методы по умолчанию, создающие тело для вашего сообщения. Если вы прочитаете исходный код в kableExtra:::print.kableExtra, вы увидите, что он действительно немного манипулирует перед отправкой объекта в браузер, поэтому вам нужно будет продублировать его.

Вот попытка сделать это. Возможно, это не самый простой способ сделать это, но при этом создается файл, который отображается правильно:

# Generate an HTML header
html_header <- htmltools::tags$head(rmarkdown::html_dependency_jquery(), 
                                    rmarkdown::html_dependency_bootstrap(theme = "simplex"), 
                                    html_dependency_kePrint())
# Declare body_B to be HTML
html_table <- htmltools::HTML(body_B)

# Glue the two parts together
html_result <- htmltools::tagList(html_header, html_table)

# Create a temp file and write the result there
html_file <- tempfile(fileext = ".html")
htmltools::save_html(html_result, file = html_file, background = "white")

# That will require several different files.  You probably want to 
# merge them all into one to display.  Pandoc can do that...
system(paste(rmarkdown::pandoc_exec(), "--self-contained --template", html_file, "-o", html_file, "</dev/null"))

# The result is now in the file named in html_file.  If you want it as
# a character variable, you can read it.
html_lines <- readLines(html_file)

Я не пытался поместить это в электронное письмо, но я не понимаю, почему это не сработает.

...