【问题标题】:Saving leaflet image inside R shiny将传单图像保存在 R 中闪亮
【发布时间】:2017-04-24 02:44:57
【问题描述】:

您好,我正在尝试将传单图像保存在 R 闪亮的应用程序中。并且可以在添加简单标记时这样做。但是最近我一直在尝试通过添加循环和遇到问题来概括这段代码,并想知道是否有其他人可以提供帮助。请参阅下面的可重现示例。

    Poly = data.frame(Strat = c("A","A","A","A","A","B","B","B","B","B"), long = c(174.5012, 174.5026, 174.5026, 174.5014,174.5012,174.5012 ,174.5020, 174.5020,174.5012,174.5012),lat = c(-35.84014, -35.84018, -35.84137,-35.84138,-35.84014,-35.84014,-35.84014,-35.84197,-35.84197,-35.84014))
    Points = data.frame(long = c(174.5014 ,174.5017, 174.5021, 174.5023, 174.5020, 174.5017 ,174.5021 ,174.5017, 174.5021, 174.5019), lat = c(-35.84187, -35.84165, -35.84220 ,-35.84121, -35.84133, -35.84034, -35.84082, -35.84101, -35.84112, -35.84084))


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


    ##### My take on Example 2
    ui <- fluidPage(
       sidebarPanel(
       checkboxInput('returnpdf', 'output pdf?', FALSE), 
       conditionalPanel(
         condition = "input.returnpdf == true",
         downloadLink('pdflink')
        ) 
       ), 
       mainPanel(leafletOutput("map"))
    )



    server = function(input, output){

    mymap <- reactive({
       leaflet() %>% addTiles()%>%  
       clearShapes() %>%
       clearMarkers() %>%      
       fitBounds(lng1 = 174.5042, lat1= -35.83814,lng2= 174.5001, lat2 = -35.8424) 
    })

    output$map <- renderLeaflet({
      mymap()      
    })

    myfun <- function(map) {
        print("adding points")
        map %>% clearShapes() %>%
        clearControls() %>% 
        clearMarkers() %>% 
        addCircles(lng = Points$long, lat = Points$lat, color = "blue",fillOpacity = 1,radius = 1)   
     }

    AddStrataPoly <- function(map) {
      print("adding polygons")    
      for(i in 1:length(unique(Poly$Strat))) {
         map %>% addPolygons(lng = Poly[Poly$Strat == unique(Poly$Strat)[i],]$long, lat = Poly[Poly$Strat == unique(Poly$Strat)[i],]$lat, layerId = unique(Poly$Strat)[i], color = 'gray60', options = list(fillOpacity = 0.1))
      } 
    }

    observe({
      leafletProxy("map") %>% myfun() %>% AddStrataPoly() 
    })

    newmap <- reactive({
      mymap() %>% myfun() %>% AddStrataPoly()
    })

    output$pdflink <- downloadHandler(
      filename = 'plot.pdf',

      content = function(file) {
        owd <- setwd(tempdir())
        on.exit(setwd(owd))
        saveWidget(newmap(), "temp.html", selfcontained = FALSE)
      }
    )
    }        

这遵循here 概述的示例。如果您运行此代码 (shinyApp(ui, server);) 并尝试单击下载链接,则会收到以下错误

ERROR: 'package' must be of length 1

虽然在线查看器工作正常,但问题似乎与下载处理程序有关。我已将问题隔离到函数AddStrataPoly() 中的循环中。并通过将AddStrataPoly() 函数替换为

来使代码正常工作
    AddStrataPoly <- function(map) {
      print("adding polygons")    
      #for(i in 1:length(unique(Poly$Strat))) {
         i = 1
         map %>% addPolygons(lng = Poly[Poly$Strat == unique(Poly$Strat)[i],]$long, lat = Poly[Poly$Strat == unique(Poly$Strat)[i],]$lat, layerId = unique(Poly$Strat)[i], color = 'gray60', options = list(fillOpacity = 0.1))
      #} 
    }

但显然它只绘制一个多边形。有人能帮我把这段代码概括一下,这样我就可以绘制很多多边形了吗?

非常感谢 C

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    在您的AddStrataPoly 函数中,如果您想按顺序添加多边形,则需要将您通过地图传递的地图替换为多边形:

    试试这个:

    AddStrataPoly <- function(map) {
        print("adding polygons")    
        for(i in 1:length(unique(Poly$Strat))) {
          map <- map %>% addPolygons(lng = Poly[Poly$Strat == unique(Poly$Strat)[i],]$long, lat = Poly[Poly$Strat == unique(Poly$Strat)[i],]$lat, layerId = unique(Poly$Strat)[i], color = 'gray60', options = list(fillOpacity = 0.1))
        } 
        map
      }
    

    我还修改了您的 downloadHandler 以使其正常工作:

    output$pdflink <- downloadHandler(
        filename = 'temp.html',
    
        content = function(file) {
          saveWidget(newmap(), file, selfcontained = TRUE)
        }
      )
    

    selfcontained=TRUE 是在文件中包含所有依赖项,以便用户可以按原样打开它。我还将目标文件更改为file,因为函数希望将内容写入那里。

    【讨论】:

    • 乐于助人。如果此答案解决了您的问题,请随时单击勾选标记将其标记为已接受。
    • 抱歉,我刚刚意识到在我使用这个网站的整个过程中,我一直在投票而不是接受答案。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2021-12-16
    • 2019-05-20
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多