Search code examples
rshinydiagrammerdata.tree

Export DiagrammeR, data.tree to image (png) in Shiny


I'm trying to download a image from a Shiny App, this image is produced by a DiagrammeR object.

This is the code:

# Load packages
library(shinythemes)
library(DiagrammeR)
library(data.tree)
library(plotly)
library(shiny)

# Load data
data(acme)

# Define UI
ui <- fluidPage(theme = shinytheme("lumen"),
                titlePanel("Paula trying II"),
                sidebarLayout(
                  sidebarPanel(downloadButton(outputId = "dld_diagrama", label = "Download diagram")),
                  mainPanel(
                    grVizOutput("tree_plot", width = "100%", height = "760px")
                  )
                )
)

# Define server function
server <- function(input, output) {

  output$tree_plot <- renderGrViz({

    plot(acme) 

  })  

output$dld_diagrama <- downloadHandler(
    filename = function(){

      paste("diagram", "png", sep = ".")
    },
    content = function(file) {
      plotly::export(tree_plot, file = "diagram.png")
    }

)

}

# Create Shiny object
shinyApp(ui = ui, server = server)

This downloads (with errors) a .txt, obviously wrong. I'm trying to download a .png Also I've tried with appshot with no success.


Solution

  • Here is one solution among many using shiny, you could also bring back the export as png button

    library(shinythemes)
    library(DiagrammeR)
    library(data.tree)
    library(plotly)
    library(shiny)
    
    data(acme)
    
    # Define UI
    ui <- fluidPage(theme = shinytheme("lumen"),
                    titlePanel("Paula trying II"),
                    sidebarLayout(
                      sidebarPanel(downloadButton(outputId = "dld_diagrama", label = "Download diagram")),
                      mainPanel(
                        grVizOutput("tree_plot", width = "100%", height = "760px")
                      )
                    )
    )
    
    # Define server function
    server <- function(input, output) {
    
      input_plot <- reactive(plot(acme))
    
      output$tree_plot <- renderGrViz({
    
        input_plot() 
    
      })  
    
      output$dld_diagrama <- downloadHandler(
        filename = function(){
    
          paste("diagram", "html", sep = ".")
        },
        content = function(file) {
          htmlwidgets::saveWidget(as_widget(input_plot()), file)
        }
    
      )
    
    }
    
    # Create Shiny object
    shinyApp(ui = ui, server = server)