Search code examples
rshinyleafletr-leaflet

How to save a leaflet map in Shiny


Following on from this question, I am looking to save and download a leaflet map as a png or jpeg image. I have the following code but I keep getting an error.

ui <- fluidPage(
  leafletOutput("map"),
  downloadButton("dl")
)

server <- function(input, output, session) {
  output$map <- renderLeaflet({
    leaflet() %>% 
      addTiles()
  })

  output$dl <- downloadHandler(
    filename = "map.png",

    content = function(file) {
      mapshot(input[["map"]], file = file)
    }
  )
}

shinyApp(ui = ui, server = server)

The error I get when I try to download (by clicking the button) is

Warning: Error in system.file: 'package' must be of length 1
Stack trace (innermost first):
    65: system.file
    64: readLines
    63: paste
    62: yaml.load
    61: yaml::yaml.load_file
    60: getDependency
    59: widget_dependencies
    58: htmltools::attachDependencies
    57: toHTML
    56: <Anonymous>
    55: do.call
    54: mapshot
    53: download$func [#11]
     4: <Anonymous>
     3: do.call
     2: print.shiny.appobj
     1: <Promise>
Error : 'package' must be of length 1

Bonus points if you can tell me how to get this working with leafletProxy.


Solution

  • May be this would help:

      server <- function(input, output, session) {
    
        map <- reactiveValues(dat = 0)
    
          output$map <- renderLeaflet({
            map$dat <- leaflet() %>% 
              addTiles()
          })
    
          output$dl <- downloadHandler(
            filename = "map.png",
    
            content = function(file) {
              mapshot(map$dat, file = file)
            }
          )
        }