rshinydownloadshinydashboardshinydashboardplus

Downlaod plotly waterfall chart as pdf does not work within shinydashboard


Im trying to download the following waterfall chart created inside a shiny dashboard as a pdf but when I use the shinydashboard interface I download an empty pdf.

library(shiny)
library(plotly)
library(shinydashboard)
library(shinydashboardPlus)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    downloadButton('downloadPlot', 'Download Plot')
  ),
  dashboardBody(plotlyOutput('pl'))
)


server <- function(input, output, session) {
  
  plotInput <- function(){
    x= list("Sales", "Consulting", "Net revenue", "Purchases", "Other expenses", "Profit before tax")
    measure= c("relative", "relative", "total", "relative", "relative", "total")
    text= c("+60", "+80", "", "-40", "-20", "Total")
    y= c(60, 80, 0, -40, -20, 0)
    data = data.frame(x=factor(x,levels=x),measure,text,y)
    
    fig <- plot_ly(
      data, name = "20", type = "waterfall", measure = ~measure,
      x = ~x, textposition = "outside", y= ~y, text =~text,
      connector = list(line = list(color= "rgb(63, 63, 63)"))) 
    fig <- fig %>%
      layout(title = "Profit and loss statement 2018",
             xaxis = list(title = ""),
             yaxis = list(title = ""),
             autosize = TRUE,
             showlegend = TRUE,waterfallgap = "0.8")
    
    fig
  }
      
  
  
      output$pl<-renderPlotly({
        plotInput()
      })

      output$downloadPlot <- downloadHandler(
        filename = "Shinyplot.pdf",
        content = function(file) {
          pdf(file)
          plotInput()
          dev.off()
        })  
  
}

shinyApp(ui = ui, server = server)

Solution

  • Plotly is not standard R graphics. You can't use dev to capture it. Try this:

        output$downloadPlot <- downloadHandler(
            filename = "Shinyplot.pdf",
            content = function(file) {
                plotly::export(plotInput(), file)
        }) 
    

    Use plotly::export to capture

    Note: export is in the process of being deprecated (use orca instead). orca needs to install some extra system dependencies.

    Usage is similar: orca(plotInput(), file = file)