简体   繁体   English

在R闪亮中保存传单地图

[英]Saving leaflet maps in R shiny

I have created an app where the user can modify a leaflet map and i would like to use this map in a pdf report. 我创建了一个应用程序,用户可以在其中修改传单地图,我想在pdf报告中使用此地图。 I have 1. installed packages leaflet, webshot and htmlwidget 2. installed PhantomJS 我有1.安装包传单,webshot和htmlwidget 2.安装了PhantomJS

below is a simplified version of the code 下面是代码的简化版本

server.R: server.R:

    library(shiny)
    library(leaflet)
    library(htmlwidgets)
    library(webshot)

    shinyServer(function(input, output, session) {

      output$amap <- renderLeaflet({
      leaflet() %>%
        addProviderTiles("Stamen.Toner",
                     options = providerTileOptions(noWrap = TRUE,      reuseTiles=TRUE))
  })

  observe({
    leafletProxy("amap") %>%
    clearShapes() %>%
    addCircles(lng = c(22,-2), lat = c(42,65))
  })



  observeEvent(input$saveButton,{
    themap<- leafletProxy("amap")
    saveWidget(themap, file="temp.html", selfcontained = F) 
    webshot("temp.html", file = "Rplot.png",
          cliprect = "viewport")

  })
})

ui.R: ui.R:

fluidPage(
  leafletOutput("amap", height="600px", width="600px"),
  br(),
  actionButton("saveButton", "Save")
  )

I get this error message: 我收到此错误消息:

Warning: Error in system.file: 'package' must be of length 1 Stack trace (innermost first): 73: system.file 72: readLines 71: paste 70: yaml.load 69: yaml::yaml.load_file 68: getDependency 67: widget_dependencies 66: htmltools::attachDependencies 65: toHTML 64: saveWidget 63: observeEventHandler [C:\\R files\\test/server.R#24] 1: shiny::runApp 警告:system.file中的错误:'package'的长度必须为1堆栈跟踪(最里面的第一个):73:system.file 72:readLines 71:paste 70:yaml.load 69:yaml :: yaml.load_file 68:getDependency 67:widget_dependencies 66:htmltools :: attachDependencies 65:toHTML 64:saveWidget 63:observeEventHandler [C:\\ R files \\ test / server.R#24] 1:shiny :: runApp

when the save button is activated. 当保存按钮被激活时。 savewidget works fine when i define the save button like this: 我定义保存按钮时savewidget工作正常:

  observeEvent(input$saveButton,{
    themap<-leaflet() %>%
      addProviderTiles("Stamen.Toner",
                       options = providerTileOptions(noWrap = TRUE, reuseTiles=TRUE))

    saveWidget(themap, file="temp.html", selfcontained = F) 
    webshot("temp.html", file = "Rplot.png",
          cliprect = "viewport")

  })

But i really want the changes that the user makes in the webshot. 但我真的想要用户在webshot中做出的更改。 Can anyone help? 有人可以帮忙吗?

This is not perfect, but here a solution using the library html2canvas . 这不是完美的,但这里使用库html2canvas的解决方案。 Please be careful of attribution, license, and copyright. 请注意归属,许可和版权。 Also, this won't work in RStudio Viewer, but there are ways to get it to work. 此外,这不会 RStudio浏览器的工作,但有办法得到它的工作。

library(leaflet)
library(htmltools)

lf <- leaflet() %>%
  addProviderTiles(
    "Stamen.Toner",
    options = providerTileOptions(
      noWrap = TRUE,
      reuseTiles=TRUE
    )
  )


#  add the mapbox leaflet-image library
#   https://github.com/mapbox/leaflet-image
#lf$dependencies[[length(lf$dependencies)+1]] <- htmlDependency(
#  name = "leaflet-image",
#  version = "0.0.4",
#  src = c(href = "http://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-image/v0.0.4/"),
#  script = "leaflet-image.js"
#)

lf$dependencies[[length(lf$dependencies)+1]] <- htmlDependency(
  name = "html2canvas",
  version = "0.5.0",
  src = c(href="https://cdn.rawgit.com/niklasvh/html2canvas/master/dist/"),
  script = "html2canvas.min.js"
)



browsable(
  tagList(
    tags$button("snapshot",id="snap"),
    lf,
    tags$script(
'
document.getElementById("snap").addEventListener("click", function() {
  var lf = document.querySelectorAll(".leaflet");
  html2canvas(lf, {
    useCORS: true,
    onrendered: function(canvas) {
      var url = canvas.toDataURL("image/png");
      var downloadLink = document.createElement("a");
      downloadLink.href = url;
      downloadLink.download = "map.png"

      document.body.appendChild(downloadLink);
      downloadLink.click();
      document.body.removeChild(downloadLink); 
    }
  });
});
'      
    )
  )
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM