r - 如何保存用户在地图上的每次点击并单独访问它们?闪亮的传单 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
解决方案
以下代码给出了预期的输出,您的预期输出是一个向量列表,但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)
推荐阅读
- javascript - 如何将oracle中的日期时间拆分为cshtml中的日期和时间?
- javascript - 尝试通过cdn使用history.js并获取非法构造函数
- java - 如何在客户端调用构造函数?
- android - 使用 Android Studio 生成发布 SHA1 证书
- ruby-on-rails - Rails 项目不让我打字?
- amazon-web-services - 如何授予我的 aws sftp 服务器访问另一个 AWS 账户中的 Amazon S3 存储桶的权限?
- oauth-2.0 - 由于谷歌身份验证已贬值,如何删除openid?
- c# - While 循环或 For 循环不退出
- http-headers - 如何更正在客户端代码中返回状态 404 的 POST 请求?
- typescript - 如何从推送页面返回而无需在 ionic 中再次重新加载父页面?