r - 如何保存用户在 map 上的每次点击并单独访问它们? Shiny 单张R

标签 r shiny leaflet

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)

enter image description here 吸引您注意力的图片

控制台:

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

上面的代码仅将用户最后一次对 map 的点击保存在“clicklist”对象中,并根据用户对 map 的点击次数重复此操作。

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

对象类是reactivevalue。

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

How to save each click and access them individually?

预期输出

>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

最佳答案

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

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)

关于r - 如何保存用户在 map 上的每次点击并单独访问它们? Shiny 单张R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61824906/

相关文章:

r - 使用 pls 包的变量和组件之间的关联

R/dplyr : Transforming two rows into two columns

javascript - visnetwork 节点标题内的 Shiny 操作按钮

javascript - 用于自定义居中的 Mapbox 和传单

javascript - 贴图: Click on a marker, 显示贴图旁边的内容?

使用来自单独数据帧的值重命名列

Rcpp - 如何检查任何属性是否为 NULL

r - updateSelectinput 抛出 session 未找到错误

javascript - DT:重新渲染表格后链接绑定(bind)丢失

javascript - 传单中的标签问题