在 R Shiny 中使用 leaflet:单击图标时创建一个模态窗口

4

我希望在shiny的leaflet地图中,当我点击一个图标时能够创建一个模态窗口。这可行吗?我尝试了下面的代码,但是bsModal没有起作用。

library(shiny)
library(leaflet)
library(shinyBS)

points <- data.frame(cbind(latitude = rnorm(40) * 2 + 13, longitude  = 
rnorm(40) + 48))


ui <- fluidPage(
  leafletOutput("mymap"),
    bsModal("modalExample", "This will open a modal", "assign_task", size = 
      "large",
    HTML(""))
    )

   server <- function(input, output, session) {



   output$mymap <- renderLeaflet({
   leaflet(options = leafletOptions(maxZoom = 18)) %>% addTiles() %>%
    addMarkers(lat = ~ latitude, lng = ~ longitude,
             data = points,
             popup=~ sprintf(
               '<button type="button" id="assign_task">Open Modal </button>'
             ))
   })
  }

shinyApp(ui, server)

enter image description here

1个回答

3
我将提供两种可能的解决方案。第一种是我认为最适合您需求的解决方案,第二种则更接近您当前的代码。希望这能帮助到您!

解决方案1:

library(shiny)
library(leaflet)

points <- data.frame(cbind(id=seq(1,40),latitude = rnorm(40) * 2 + 13, longitude  = 
                             rnorm(40) + 48))


ui <- fluidPage(
  leafletOutput("mymap"),
  actionButton("action1","Show modal")
)

server <- function(input, output, session) {

  observeEvent(input$mymap_marker_click, {
    id = input$mymap_marker_click$id
    showModal(modalDialog(
      title = "You selected a marker!",
      paste0("ID: ", id, ", lat: ", round(points$latitude[id==id],2),", lon: ", round(points$longitude[id==id],2))
    ))
  })

  output$mymap <- renderLeaflet({
    leaflet(options = leafletOptions(maxZoom = 18)) %>% addTiles() %>%
      addMarkers(layerId =  ~ id,lat = ~ latitude, lng = ~ longitude,
                 data = points
      )
  })
}

shinyApp(ui, server)

解决方案2:
library(shiny)
library(leaflet)
library(shinyBS)

points <- data.frame(cbind(latitude = rnorm(40) * 2 + 13, longitude  = 
                             rnorm(40) + 48))


ui <- fluidPage(
  leafletOutput("mymap"),
    actionButton("action1","Show modal")
)

server <- function(input, output, session) {

  observeEvent(input$button_click, {
    showModal(modalDialog(
      title = "Important message",
      "This is an important message!"
    ))
  })

  output$mymap <- renderLeaflet({
    leaflet(options = leafletOptions(maxZoom = 18)) %>% addTiles() %>%
      addMarkers(lat = ~ latitude, lng = ~ longitude,
                 data = points,
                 popup= ~paste("<b>", latitude, longitude, "</b></br>", actionButton("showmodal", "Show modal", onclick = 'Shiny.onInputChange(\"button_click\",  Math.random())')))
  })
}

shinyApp(ui, server)

"Shiny.onInputChange("button_click"是我一直在寻找的魔法。我将在不同情况下使用它。感谢您向我介绍它 :) - Fisseha Berhane
1
根据某些条件添加弹出窗口是否可能?例如,如果纬度大于某个值? - Fisseha Berhane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接