How to output two grid plots(grid.draw) togather and download them in shinyapp?

I used grid.draw() function of ggnewscale package to get the plot

But it seems the way of download is not the same to ggplot2 type.

I used pdf() to save my plot result in shinyapp.

But when I click the download button the plot result is not picture type or not pdf

It confused me.

Here is my reproducible code and data:

   options(encoding = "UTF-8")
    library(stats)
    library(openxlsx)
    library(shiny)
    library(dplyr)
    library(tidyr)      
    library(ggplot2)
    library(gridExtra)  
    library(ggpubr)
    library(shinythemes)
    library(ggpattern)
    library(grid)
    library(ggh4x)
    library(ggnewscale)
    library(psych)
    library(DT)
    library(shinyBS)
    library(shinyjs)    
    
    ###
    
    
data <- data.frame(
  Name = c(paste0("Group_", LETTERS[1:20])),
  matx <- matrix(sample(1:1000, 1000, replace = T), nrow = 20)
)
names(data)[-1] <- c(paste0("Gene_", 1:50))


Nameff<-structure(list(Name = c("8_TBI(1 month)", "9_control", "9_VEGF", 
                                "10_control", "10_VEGF", "11_Brain Healty", "12_control_1", "12_control_2", 
                                "12_AOD(Jnk1/2/3 ko)", "13_control", "13_Cpt1_ko(Cdh5 driven)", 
                                "14_control", "14_Tsc2ko(Tbx4 driven)", "15_control", "15_Zmpste24 ko", 
                                "16_control", "16_Adrenomedullin\r\nko(Cdh5 driven)", "17_Lung Healthy", 
                                "18_control(14w)", "18_carboplatin(14w)"), Disease = c("TBI\r\n1month", 
                                                                                       "VEGF\r\nsti_DG\r\nregion", "VEGF\r\nsti_DG\r\nregion", "VEGF\r\nsti_CA1\r\nregion", 
                                                                                       "VEGF\r\nsti_CA1\r\nregion", "Healthy\r\n(Brain)", "AOD", "AOD", 
                                                                                       "AOD", "CPT1\r\nko", "CPT1\r\nko", "Tsc2\r\nko", "Tsc2\r\nko", 
                                                                                       "Zmpste\r\n_24 ko", "Zmpste\r\n_24 ko", "AM\r\nko", "AM\r\nko", 
                                                                                       "Healthy\r\n(Lung)", "Chemo/Radio\r\n(Tibiae)", "Chemo/Radio\r\n(Tibiae)"
                                ), Organ = c("Brain", "Brain", "Brain", "Brain", "Brain", "Brain", 
                                             "Lung", "Lung", "Lung", "Lung", "Lung", "Lung", "Lung", "Lung", 
                                             "Lung", "Lung", "Lung", "Lung", "Bone", "Bone"), fill = c("#f15a24", 
                                                                                                       "#FFFFFF", "#f15a24", "#FFFFFF", "#f15a24", "#FFFFFF", "#FFFFFF", 
                                                                                                       "#FFFFFF", "#00FF00", "#FFFFFF", "#00FF00", "#FFFFFF", "#00FF00", 
                                                                                                       "#FFFFFF", "#00FF00", "#FFFFFF", "#00FF00", "#FFFFFF", "#FFFFFF", 
                                                                                                       "#7570B3"), Condition = c("#CCCCFF", "#d9e021", "#d9e021", "#d9e021", 
                                                                                                                                 "#d9e021", "#CCCCFF", "#CCCCFF", "#CCCCFF", "#CCCCFF", "#fbb03b", 
                                                                                                                                 "#fbb03b", "#fbb03b", "#fbb03b", "#fbb03b", "#fbb03b", "#fbb03b", 
                                                                                                                                 "#fbb03b", "#fbb03b", "#d9e021", "#d9e021"), Organ_fill = c("#f15a24", 
                                                                                                                                                                                             "#f15a24", "#f15a24", "#f15a24", "#f15a24", "#f15a24", "#00FF00", 
                                                                                                                                                                                             "#00FF00", "#00FF00", "#00FF00", "#00FF00", "#00FF00", "#00FF00", 
                                                                                                                                                                                             "#00FF00", "#00FF00", "#00FF00", "#00FF00", "#00FF00", "#7570B3", 
                                                                                                                                                                                             "#7570B3"), Alpha = c(1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 
                                                                                                                                                                                                                   0, 1, 0, 1, 0, 0, 1)), row.names = 22:41, class = "data.frame")
####################################################################
ui <- fluidPage(
  theme = shinytheme("superhero"),
  ##
  useShinyjs(),
  ##  
  pageWithSidebar(
    tags$h4(
      Sys.time()),
    sidebarPanel(
      tags$h3("1111"),
      selectInput(
        "selectGeneSymbol", 
        "444d:", 
        choices = colnames(data[,-1]),
        multiple =F,
        width = 400,
        selected = NULL
      ),

      actionButton(inputId = "plot1", label = "down1",width=80),
      actionButton(inputId = "plot2", label = "down2",width=80),
      actionButton(inputId = "all",label = "down1&down2",width=120),
      
      hr(),
      tags$h5(tags$strong("down:")),
      downloadButton("p1", "down1",width=120),
      downloadButton("p2", "down2",width=120)
      
    ),
    
    mainPanel(
      tabsetPanel(
        tabPanel(icon("home"),

                 uiOutput("all")


                 ))
)
)
)
server <- function(input, output, session) {
  ##
  
  plot_data1 <- reactive({
    subset(data, colnames(data[,-1]) %in% input$selectGeneSymbol)
  })
  
  plot_data2 <- reactive({
    subset(data, colnames(data[,-1]) %in% input$selectGeneSymbol)
  })
  
  ##
  global <- reactiveValues(out = NULL,
                           p1 = NULL,
                           p2 = NULL)
  ## 
  observeEvent(input$plot1, {
    global$out <- plotOutput("plot1", height=600)
  })
  ##
  observeEvent(input$plot2, {
    global$out <- plotOutput("plot2", height=600)
  })
  
  observeEvent(input$all, {
    global$out <- plotOutput("plot3", height=600)
  })
  ###############
  output$all <- renderUI({
    global$out
  })
  
  p1 <- eventReactive(list(input$plot1,
                           input$all), {
                            datamean_sd<-data.frame(
                               Nameff,
                               mean=tapply(data[,input$selectGeneSymbol],data$Name,mean),
                               sd=tapply(data[,input$selectGeneSymbol],data$Name,sd)
                             ) 

                             p<-ggplot(data = datamean_sd, aes(Name,mean, label = Name, fill=Organ)) +
                               geom_bar(position="dodge2", stat="identity",width = 0.85,color="black",alpha=datamean_sd$Alpha) +
                               facet_nested(.~Organ+Disease, scales = "free_x", space = "free_x",switch = "x")+
                               theme_classic2() +
                               theme(legend.position = "bottom",
                                     legend.box = "horizontal",
                                     plot.title = element_text(hjust = 0.5),
                                     plot.margin = unit(c(5, 10, 20, 15), "mm"),
                                     strip.background = element_rect(colour="black", fill="white"),
                                     strip.text.x = element_text(size = 6, angle=0),
                                     axis.text.x=element_text(size=8),
                                     strip.placement = "outside"
                               ) +
                               rotate_x_text(angle = 90)+
                               scale_fill_manual(name = "Organ",values = unique(datamean_sd$Organ_fill))

                             gt <- ggplotGrob(p)
                             grid::grid.newpage(); grid::grid.draw(gt)
                           })
  
  p2 <- eventReactive(list(input$plot2,
                           input$all), {
                             datamean_sd<-data.frame(
                               Nameff,
                               mean=tapply(data[,input$selectGeneSymbol],data$Name,mean),
                               sd=tapply(data[,input$selectGeneSymbol],data$Name,sd)
                             ) 
                             
                             p<-ggplot(data = datamean_sd, aes(Name,mean, label = Name, fill=Organ)) +
                               geom_bar(position="dodge2", stat="identity",width = 0.85,color="black",alpha=datamean_sd$Alpha) +
                               facet_nested(.~Organ+Disease, scales = "free_x", space = "free_x",switch = "x")+
                               theme_classic2() +
                               theme(legend.position = "bottom",
                                     legend.box = "horizontal",
                                     plot.title = element_text(hjust = 0.5),
                                     plot.margin = unit(c(5, 10, 20, 15), "mm"),
                                     strip.background = element_rect(colour="black", fill="white"),
                                     strip.text.x = element_text(size = 6, angle=0),
                                     axis.text.x=element_text(size=8),
                                     strip.placement = "outside"
                               ) +
                               rotate_x_text(angle = 90)+
                               scale_fill_manual(name = "Organ",values = unique(datamean_sd$Organ_fill))
                             
                             gt <- ggplotGrob(p)
                             grid::grid.newpage(); grid::grid.draw(gt)
                             
                           })
  

  
  output$plot1 <- renderPlot({ p1() })
  output$plot2 <- renderPlot({ p2() })
  output$plot3 <- renderPlot({ 
    ##    plot_list <- list(p1(),p2())
    #    grid.arrange(grob(p1(),p2(), ncol=1)) 
    lollipop <- gTree(children = gList(p1(), p2()))
    grid.draw(lollipop)
    
  })
  #download p1
  output$p1 <- downloadHandler(
    filename = function() {
      paste0(input$selectGeneSymbol,"_123",".pdf")
    },
    content = function(file) {
      pdf(file,width=20,height=10)
      datamean_sd<-data.frame(
        Nameff,
        mean=tapply(data[,input$selectGeneSymbol],data$Name,mean),
        sd=tapply(data[,input$selectGeneSymbol],data$Name,sd)
      ) 
      
      p<-ggplot(data = datamean_sd, aes(Name,mean, label = Name, fill=Organ)) +
        geom_bar(position="dodge2", stat="identity",width = 0.85,color="black",alpha=datamean_sd$Alpha) +
        facet_nested(.~Organ+Disease, scales = "free_x", space = "free_x",switch = "x")+
        theme_classic2() +
        theme(legend.position = "bottom",
              legend.box = "horizontal",
              plot.title = element_text(hjust = 0.5),
              plot.margin = unit(c(5, 10, 20, 15), "mm"),
              strip.background = element_rect(colour="black", fill="white"),
              strip.text.x = element_text(size = 6, angle=0),
              axis.text.x=element_text(size=8),
              strip.placement = "outside"
        ) +
        rotate_x_text(angle = 90)+
        scale_fill_manual(name = "Organ",values = unique(datamean_sd$Organ_fill))
      
      gt <- ggplotGrob(p)
      grid::grid.newpage(); grid::grid.draw(gt)
      dev.off()
    }
  )
  
  #download p2
  output$p2 <- downloadHandler(
    filename = function() {
      paste0(input$selectGeneSymbol,"_123",".pdf")
    },
    content = function(file) {
      ggsave(file,p2(),width=20,height=10)
      grid::grid.newpage(); grid::grid.draw(gt)
      dev.off()
    }
  )


}


# Create Shiny app ----
shinyApp(ui = ui, server = server)

The biggest problem to me is I used the grid.draw() to create a plot in p1() in my shiny.
And I don't know how to download it in downloadHandler() function.

I tried to use grid::grid.newpage(); grid::grid.draw(gt) in downloadHandler() but it doesn't work.

I found a stupid solution that is run the code of p1() in downloadHandler() again so I can download it but it is complex you know.
Just like this:

https://stackoverflow.com/questions/46499719/error-in-using-heatmap-as-the-plot-input-of-ggsave

I know there is something wrong in my download code. But I need your help to deal with it.

I need the right way to download grid.draw(plot) result in shinyapp.

I found a not perfectly way to download p1 or p2 in downloadHandler() but I need a better way to deal with it.

And all of p1 and p2 are grid types .I'd like to output them togather .
But it doesn't work when I use grid.arrange(p1(),p2()) function.
Because it is used for ggplot2 type.

#########

My first question: how to download p1 or p2 in a better way because of the grid type plot.

My second question: how to output p1() and p2() togathere just like grid.arrange() function?

Vary thanks.