在 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)
提前感谢您阅读我的 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 解决此问题但无济于事。
这个
这个link: 用户和我有类似的问题,有评论提出了答案,但我不明白如何实现。没有给出直接的解决方案。评论是,“您可以使用 input$mymap_marker_click 并将其保存在 reactiveValue 中以记住最后单击了哪个标记。在给定的样本数据中,标记似乎没有 ID”。
此
这个
这个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)