检索Shiny APP

时间:2016-02-25 10:59:15

标签: javascript r shiny leaflet

我有一个传单地图,其中包含可拖动的标记和形状,用户绘制的特征(使用leaflet.draw插件)。现在我想从传单地图中可编程地检索图层/组中的所有要素。

我应该如何实现这个功能?谢谢你的任何建议。

在这里我提供了一个简单的例子,随机的一组标记被添加到带有组markers的传单地图中(代码直接从https://rstudio.github.io/leaflet/shiny.html复制并进行了一些更改)。我的目标是检索所有新标记的位置。

我真正的问题是多边形,可能比这更复杂,但方法应该类似。

library(shiny)
library(leaflet)

r_colors <- rgb(t(col2rgb(colors()) / 255))
names(r_colors) <- colors()

ui <- fluidPage(
  leafletOutput("mymap"),
  p(),
  actionButton("recalc", "New points"),
  verbatimTextOutput('summary')
)

server <- function(input, output, session) {

  points <- eventReactive(input$recalc, {
    cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
  }, ignoreNULL = FALSE)

  output$mymap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Stamen.TonerLite",
                       options = providerTileOptions(noWrap = TRUE)
      ) %>%
      addMarkers(data = points(), group = 'markers')
  })

  output$summary <- renderPrint({
    # Add some codes here
    # .....

  })
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

要从地图对象获取点数,您仍然可以使用reactiveValues()存储地图对象,并通过observe()按下按钮进行更新。然后,您可以访问其所有属性。

library(shiny)
library(leaflet)

r_colors <- rgb(t(col2rgb(colors()) / 255))
names(r_colors) <- colors()

ui <- fluidPage(
    leafletOutput("mymap"),
    p(),
    actionButton("recalc", "New points"),
    verbatimTextOutput('summary')
)

server <- function(input, output, session) {

    rv <- reactiveValues()
    rv$m <- NULL
    rv$p <- NULL

    points <- eventReactive(input$recalc, {
        cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
    }, ignoreNULL = FALSE)

    output$mymap <- renderLeaflet({
        m <- leaflet() %>%
            addProviderTiles("Stamen.TonerLite",
                    options = providerTileOptions(noWrap = TRUE)) %>%
            addMarkers(data = points(), group = 'markers')
        rv$m <- m
        return(m)
    })

    observe({
        input$recalc
        ## I'm 90% confident these are the arguments you want...
        rv$p <- data.frame(x = rv$m$x$calls[[2]]$args[[1]],
                           y = rv$m$x$calls[[2]]$args[[2]])
    })

    output$summary <- renderPrint({
        # print points
        rv$p
    })
}

shinyApp(ui, server) 

旧解决方案

我要离开这里,因为它可能对其他人有用

您可以使用reactiveValues()point数据存储在其中,然后在print

中输出该数据
server <- function(input, output, session) {

  rv <- reactiveValues()
  rv$points <- cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)

  observe({

    if(input$recalc){
      p <-  cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
      rv$points <- p
    }
  })

  output$mymap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Stamen.TonerLite",
                       options = providerTileOptions(noWrap = TRUE)
      ) %>%
      addMarkers(data = rv$points, group = 'markers')
  })

  output$summary <- renderPrint({
    # Add some codes here
    # .....
    rv$points
  })
}
shinyApp(ui, server)