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"
上面的代码仅将用户最后一次对 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/