Сделать пэчворк совместимым с создателем PDF с помощью downloadHandler в Shiny?

Я заинтересован в использовании пакета patchwork для создания набора графиков, которые конечный пользователь может затем загрузить с помощью кнопки загрузки. Для простоты я показал только один график в этом примере.

Пример сценария:

library(shiny)
library(tidyverse)
library(Cairo)
library(grDevices)

ui <- fluidPage(

  mainPanel(
    tabsetPanel(
      tabPanel(
        "PDF this plot with patchwork", 
        plotOutput("diamonds"),
        downloadButton("downloadPlot", "Download Plot")
      )
    )
  )
)

server <- function(input, output, session){

  output$diamonds <- renderPlot({
    ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point() + geom_smooth()
  })

  output$downloadPlot <- downloadHandler(
    filename = "my_plot.pdf",

    content = function(file){
      cairo_pdf(filename = file,
                width = 18, height = 10, pointsize = 12, family = "sans", bg = "transparent",
                antialias = "subpixel",fallback_resolution = 300)
      patchwork::wrap_plots(ggplot(diamonds, aes(x=carat, y=price, color=cut)) + geom_point() + geom_smooth())
      dev.off()
    },

    contentType = "application/pdf"
  )
}

shinyApp(ui=ui, server=server)

В этом случае сгенерированный PDF-файл пуст. Я посмотрел на этот соответствующий вопрос, и если я заменю patchwork::wrap_plots на gridExtra::grid.arrange, приложение теперь работает, однако есть много причин, по которым я бы предпочел использовать patchwork, которые я не указал (название сюжета, субтитры и т. д.). Для моего реального сценария я также не заинтересован в использовании Markdown.


person Nautica    schedule 06.06.2020    source источник