首页 > 解决方案 > 如何保存用户在地图上的每次点击并单独访问它们?闪亮的传单 R

问题描述

library(shiny)
library(leaflet)
library(leaflet.providers)
ui <- fluidPage(
  leafletOutput('map',width = "1331",height = "400"))
  
server <- function(input, output, session){
  output$map <- renderLeaflet({
    m<-leaflet() %>%
      addProviderTiles(providers$OpenStreetMap,
                       options = providerTileOptions(noWrap = TRUE))%>%
      setView(lng =-73.935242, lat =40.730610, zoom= 12)})
  
  
  observe({  click = input$map_click
  if(is.null(click))
    return()
  else
    clicks=data.frame(click[1:2])
  leafletProxy("map") %>%
    addMarkers(data = clicks) #Adds a marker on each click

    
  clicklist <<- reactiveVal(list()) # empty list
  observeEvent(input$map_click, {
    click <- input$map_click
    temp <<- clicklist() # get the list of past clicks 
    temp[[length(temp)+1]] <<- click[1:2] # add this click to the list
    clicklist(temp)
    print(clicklist)})  #show on the console  lat and lng

  })
    }
shinyApp(ui = ui, server = server)

在此处输入图像描述 吸引您注意的图像

安慰:

reactiveVal: [1] "40.74778, -73.97953" 
reactiveVal: [1] "40.73191, -73.99704" 
reactiveVal: [1] "40.73191, -73.99704" "40.73191, -73.99704" 

上面的代码只将用户最后一次点击地图保存在“clicklist”对象中,并重复用户点击地图的次数。

>clicklist
reactiveVal: [1] "40.72931, -73.99326" "40.72931, -73.99326" "40.72931, -73.99326" 

对象类是反应值。

> class(clicklist)
[1] "reactiveVal" "reactive"

如何保存每次点击并单独访问它们?

预期产出

>clicklist
[[1]]
[1]40.74778 -73.97953
[[2]]
[1]40.73191 -73.99704 

>clicklist[1]
[1] 40.74778, -73.97953

>clicklist[1][[1]][1]
[1] 40.74778

>clicklist[1][[1]][2]
-73.97953

>clicklist[2]
[[1]]
[1]  40.73191 -73.99704

>clicklist[2][[1]][1]
[1] 40.73191

> clicklist[2][[1]][2]
[1] -73.99704

标签: rshinyleaflet

解决方案


以下代码给出了预期的输出,您的预期输出是一个向量列表,但input$map_click给出了一个列表,确切地说是一个命名列表。要将其转换为向量,我们使用了unlist,因为您想要的输出在向量中也没有名称,所以我们过去常常unname删除名称。此外,如果您的代码由于某些输入不可用而导致应用程序初始化中断,请使用req让观察者等待该输入。这是处理此类行为的推荐方法之一。<<不建议在闪亮的应用程序中使用,并且要非常小心地使用。在您的代码中,它实际上是多余的。

library(shiny)
library(leaflet)
library(leaflet.providers)
ui <- fluidPage(
  leafletOutput('map',width = "1331",height = "400"))

server <- function(input, output, session){
  output$map <- renderLeaflet({
    m <-leaflet() %>%
      addProviderTiles(providers$OpenStreetMap,
                       options = providerTileOptions(noWrap = TRUE))%>%
      setView(lng =-73.935242, lat =40.730610, zoom= 12)})


  observe({
    req(input$map_click)
    clicks <- data.frame(input$map_click[1:2])
    leafletProxy("map") %>%
      addMarkers(data = clicks) #Adds a marker on each click
  })

  clicklist <- reactiveVal(list()) # empty list

  observeEvent(input$map_click, {
    click <- input$map_click
    temp <- clicklist() # get the list of past clicks 
    temp[[length(temp)+1]] <- unname(unlist(click[1:2])) # add this click to the list
    clicklist(temp)
    print(clicklist())
  })  #show on the console  lat and lng
}

shinyApp(ui = ui, server = server)

推荐阅读