создать PNG-изображение объекта flextble

Мне нужно создать файл PNG объекта flextable, чтобы я мог добавить его в отчет PDF. текущая версия flextable не поддерживает файлы pdf напрямую. Я попытался использовать подход png()/dev.off(), но в результирующем файле нет изображения, он сохраняется, но таблица не отображается.

Вот простой рабочий пример

library(officer)
library(flextable)
library(magrittr)

ID <- c("C01"," "," ","C02"," "," ","C03"," "," ")
Data <- c("Problem 1","Answer 1","Note 1","Problem 2","Answer 2","Note 2","Problem 3","Answer 3","Note 3")
Rank <- c("L"," "," ","L"," "," ","L"," "," ")
finalResults <- data.frame(ID,Data,Rank)

  plotIn <- function(x){

  results_table1 <- flextable(x) %>%
    theme_box() %>%

    ### Column Headers

    #  format column headers for table

    bold(part = "header") %>%
    fontsize(part = "header",size = 18) %>%
    align(part="header",align="center") %>%

    ### Body  

    # set column widths

    width(j =  ~ID, width = 1) %>%
    width(j =  ~Data, width = 8) %>%
    width(j =  ~Rank, width = 1) %>%

    # format general body of table

    fontsize(part = "body",size = 18) %>%
    align(j = ~ID, align = "center", part = "body") %>%
    align(j = ~Data, align = "left", part = "body") %>%
    align(j = ~Rank, align = "center", part = "body") %>%
    padding( padding = 5, part = "all" ) %>%
    style(pr_c = fp_cell(border = fp_border(color="black", width = 2)),part = "all") #%>%

  # format cell merging

   for(mm in seq(from=1,to=(nrow(x)-2),by=3)) {
     results_table1 <- merge_at(results_table1,i=mm:(mm+2), j = ~ID, part = "body")
     results_table1 <- merge_at(results_table1,i=mm:(mm+2), j = ~Rank, part = "body")
   }

  results_table1

  }  

  png("summary.png")
  plotIn(finalResults)
  dev.off()

Моя информация о сеансе следующая:

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] magrittr_1.5    flextable_0.4.2 officer_0.2.1   shinyjs_0.8     shiny_1.0.5    

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.15      knitr_1.15.1      xml2_1.1.1        uuid_0.1-2       
 [5] xtable_1.8-2      R6_2.2.0          stringr_1.1.0     tools_3.3.2      
 [9] packrat_0.4.8-1   R.oo_1.21.0       miniUI_0.1.1      htmltools_0.3.5  
[13] yaml_2.1.14       digest_0.6.10     rprojroot_1.1     zip_1.0.0        
[17] base64enc_0.1-3   R.utils_2.5.0     mime_0.5          evaluate_0.10    
[21] rmarkdown_1.8     stringi_1.1.2     gdtools_0.1.6     backports_1.0.4  
[25] R.methodsS3_1.7.1 jsonlite_1.1      httpuv_1.3.5 

Поскольку StackOverflow требует больше текста, я просто пытаюсь заполнить здесь место, где мне разрешено задавать вопрос.


person Joe Hightower    schedule 28.02.2018    source источник
comment
См. этот ответ для руководства.   -  person Kevin Arseneau    schedule 01.03.2018
comment
Кстати, если я просматриваю таблицу в RStudio Viewer, я могу сохранить ее как PNG. Это можно сделать, мне просто нужен автоматизированный подход, чтобы сохранить объект, а затем открыть сохраненный файл в отчете PDF.   -  person Joe Hightower    schedule 01.03.2018
comment
Потому что вьювер по сути является браузером, отображающим html. Сохранение таким образом аналогично использованию webshot, как указано в моей ссылке.   -  person Kevin Arseneau    schedule 01.03.2018
comment
Я вижу, это может сработать. Но я использую следующее вместо Knitr для создания PDF-файла. Будет ли это иметь значение? rmarkdown::render(tempReport, output_file = файл, params = params, envir = new.env(parent = globalenv())   -  person Joe Hightower    schedule 01.03.2018
comment
и запускается ли предлагаемый код внутри файла Rmd? будет ли иметь значение заголовок yaml, указывающий на PDF в качестве типа документа?   -  person Joe Hightower    schedule 01.03.2018
comment
Использование render по-прежнему будет обрабатывать фрагменты кода, это просто консольная версия нажатия кнопки knit в RStudio IDE.   -  person Kevin Arseneau    schedule 01.03.2018
comment
Это совершенно другой вопрос... Но вы можете указать формат вывода в своем выражении render   -  person Kevin Arseneau    schedule 01.03.2018
comment
первая проблема, с которой я столкнулся, заключается в том, что as.html нельзя найти в функции HTML в пакете htmltools, а htmltools::HTML((results_table1)) выдает ошибку о том, что без него не является вектором символов   -  person Joe Hightower    schedule 01.03.2018
comment
@JoeHightower as.html не является частью flextable. Пожалуйста, прочтите руководство. Вам не нужно htmltools::HTML(... Как я уже говорил вам несколько дней назад, это предоставляется htmltools_value (davidgohel.github.io/flextable/reference/).   -  person David Gohel    schedule 01.03.2018
comment
Функция png открывает новое графическое устройство. flextable не является функцией построения графика.   -  person David Gohel    schedule 01.03.2018
comment
текущая версия flextable не поддерживает файлы pdf напрямую. Поддержка PDF никогда не предоставлялась.   -  person David Gohel    schedule 01.03.2018
comment
Но, как я уже упоминал, в версии 0.2.0 я смог использовать функцию tabwid внутри pdf. Тогда работало, пусть и не по замыслу. Конечно, было бы неплохо, чтобы он снова работал.   -  person Joe Hightower    schedule 01.03.2018
comment
У меня были проблемы с этим из-за зависимости от веб-шота. Я предпочитаю потратить время позже на реальный выход в формате PDF, если это возможно :)   -  person David Gohel    schedule 01.03.2018


Ответы (1)


Следующий код должен помочь:

insert_screenshot = function(x, png_file ) {
  htmltools::save_html(htmltools_value(x), 'temp.html')
  res = webshot::webshot('temp.html', png_file)
  unlink('temp.html')
  res
}
insert_screenshot(plotIn(finalResults), 'my-screenshot.png')
person David Gohel    schedule 01.03.2018
comment
Давид, еще раз спасибо. Это отлично генерирует файл png! У меня возникли проблемы с отображением файла в формате pdf, но для решения этой проблемы я открою новый вопрос. Это больше не проблема гибкости. Спасибо еще раз - person Joe Hightower; 01.03.2018