在 observeEvent 上使用带有标记单击和按钮单击的 actionButton 不返回任何功能

Using actionButton with marker-click and button-click on observeEvent returning no features

提前感谢您阅读我的 post。

首先,让我说我确信解决方案可能很简单,不要让我的文字墙劝阻你。我是闪亮的新手。

上下文:我使用的是最新版本的 R (4.0.3)。我有一个闪亮的传单应用程序,其中填充了 addMarkers()。单击标记时,会出现一个带有信息的弹出窗口(名称、类型、地址、电子邮件、地区、调查)。这是标准的 addMarkers(data=...,popup=...) 调用。

此外,弹出窗口包含一个 actionButton(“查看更多详细信息”按钮),用于侦听 observeEvent(即,当用户单击按钮时)。 observeEvent 应该在 shinyalert 中显示相同的弹出窗口详细信息。

问题:弹出窗口上的操作按钮 returns 什么都没有,而不是单击的功能。

假设的解决方案:我怀疑它与需要唯一 ID 的按钮单击以及随后在 observeEvent 中的唯一 ID 有关。 我不知道如何在 actionButton 行的 JavaScript 中执行此操作。我试过 reactiveValues 无济于事。

又一层复杂:解决方案一定不能使用leafletProxy。原因是 markerClusteroptions(JS=....) 通过管道进入 leafletProxy 中断。我有自定义的簇颜色。如果我添加 leafletproxy,它们就会中断。这是闪亮的一个已知问题。

Javascript links:我需要它在 R 中工作,而不是 JS。但是,如果解决方案具有 R 的 JS 包装器,我对此持开放态度。

请帮忙!

示例全功能代码:

library(leaflet)
library(shiny)
library(shinyalert)

myData <- data.frame(
  lat = c(54.406486, 53.406486),
  lng = c(-2.925284, -1.925284),
  id = c(1,2),
  name= c("Location1", "Location2")
)
    
ui <- fluidPage(
  leafletOutput("map"),
  p(),
  useShinyalert()
)

server <- shinyServer(function(input, output) {
  data <- reactiveValues(clickedMarker=NULL)
  # produce the basic leaflet map with single marker
  output$map <- renderLeaflet(
    leaflet() %>%
      addProviderTiles("CartoDB.Positron") %>%
      #dont worry about the spacing its just an example
      addMarkers(lat = myData$lat, lng = myData$lng, layerId = myData$id, popup= (paste0(myData$name, myData$lat, myData$lng,actionButton("showmodal", "Expand to show more details", onclick = 'Shiny.onInputChange(\"button_click\",  Math.random())'))
      ))#close circle markers  
  )#close render
  # observe the marker click info and print to console when it is changed.

  observeEvent( input$showmodal,{
    {
    print("observed map_marker_click and button click")
    data$clickedMarker <- input$showmodal
    print(data$clickedMarker)
    shinyalert(title= "testing",
    text= data$lng,
          data$name)

  })#close observeevent
})#close shiny

shinyApp(ui, server)

附录:此 post 不是重复的,因为我已尝试使用给定的 link 解决此问题但无济于事。

这个:给出的答案没有部署在我的R版本中。听起来这个答案并没有完全解决用户的问题,不管错误是什么,因为它返回了 blank s。答案似乎也比我的问题的解决方案更复杂。

这个link: 用户和我有类似的问题,有评论提出了答案,但我不明白如何实现。没有给出直接的解决方案。评论是,“您可以使用 input$mymap_marker_click 并将其保存在 reactiveValue 中以记住最后单击了哪个标记。在给定的样本数据中,标记似乎没有 ID”。

:此 link 示例有效,但我不明白如何为我的应用程序和代码重新配置答案。只是太不一样了,我没有足够的知识来弄明白。

这个 : 做的是​​我想要的,但我之前有一个额外的按钮点击,所以我不确定如何实现它。当我尝试按照类似的方法存储反应值和 observeEvent 时,我的应用程序不起作用。

这个link:非常接近我想要的,但是我观察的不是$map_marker_click,而是$button_click。我尝试实现它,但它 returns 出错了。 nilsole 的第二个解决方案我无法使用,因为我的代码中的 leafletproxy 与 JS 冲突。

编辑:非常感谢 geovany!解决了:)

你应该观察到 button_click 而不是 showmodal,实际上 showmodal 被忽略了,因为它在弹出窗口中。如果没有那里,您将无法从 data 检索“名称”、“经度”和“经纬度”。最初 data 仅包含 clickedMarker 和 NULL,稍后当用户单击该按钮时,它将再次只有 NULL。您可以使用 input$map_marker_click$id 获取 layerID 参数的值,然后使用 id 值作为索引来访问 myData 中的值。下面是对实现该想法的代码的修改。

library(leaflet)
library(shiny)
library(shinyalert)

myData <- data.frame(
  lat = c(54.406486, 53.406486),
  lng = c(-2.925284, -1.925284),
  id = c(1,2),
  name= c("Location1", "Location2")
)

ui <- fluidPage(
  leafletOutput("map"),
  p(),
  useShinyalert()
)

server <- shinyServer(function(input, output) {
  # produce the basic leaflet map with single marker
  output$map <- renderLeaflet(
    leaflet() %>%
      addProviderTiles("CartoDB.Positron") %>%
      #dont worry about the spacing its just an example
      addMarkers(
        lat = myData$lat, lng = myData$lng, layerId = myData$id, 
        popup= (paste0(
          myData$name, ": ", myData$lat, ", ", myData$lng,
          actionButton("showmodal", "Expand to show more details", 
                       onclick = 'Shiny.onInputChange("button_click",  Math.random())')
        ))
      )#close circle markers  
  )#close render
  # observe the marker click info and print to console when it is changed.
  
  observeEvent( input$button_click,{
    print("observed button_click and get id from map_marker_click$id")
    id <- input$map_marker_click$id
    shinyalert(
      title = "testing",
      text = paste0(myData$name[id], ": ", myData$lat[id], ", ", myData$lng[id])
    )
  })
  
})#close shiny

shinyApp(ui, server)