This is a rather difficult task. And I do not think this is impossible.
: Shiny side , , .
: , Popup input$mymap_shape_mouseover. clearPopups . , layerId, , . , .
, clearPopup mouseout , . , , , , , mouseout, /. , , , , .
input$mymap_popup_mouseover, , , leaflet , . Github, .
:
library(shiny)
library(leaflet)
library(data.table)
uu <- data.table(
row_num=seq(100),
Latitude=c(52+cumsum(runif(100,-0.001,0.001))),
Longitude=c(1+cumsum(runif(100,-0.001,0.001)))
)
ui <- fluidPage(
leafletOutput("mymap")
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addCircles(lng = uu$Longitude, lat = uu$Latitude, radius = 2, layerId = uu$row_num)
})
observeEvent(input$mymap_shape_mouseover$id, {
pointId <- input$mymap_shape_mouseover$id
lat = uu[uu$row_num == pointId, Latitude]
lng = uu[uu$row_num == pointId, Longitude]
leafletProxy("mymap") %>% addPopups(lat = lat, lng = lng, as.character(pointId), layerId = "hoverPopup")
})
}
shinyApp(ui, server)
EDIT: .
- . , mouseover/mouseout. , , . .
library(shiny)
library(leaflet)
library(data.table)
uu <- data.table(
row_num=seq(100),
Latitude=c(52+cumsum(runif(100,-0.001,0.001))),
Longitude=c(1+cumsum(runif(100,-0.001,0.001)))
)
ui <- fluidPage(
leafletOutput("mymap")
)
server <- function(input, output, session) {
radius = 3
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addCircles(lng = uu$Longitude, lat = uu$Latitude, radius = radius, layerId = uu$row_num)
})
observeEvent(input$mymap_shape_mouseout$id, {
leafletProxy("mymap") %>% clearPopups()
})
observeEvent(input$mymap_shape_mouseover$id, {
pointId <- input$mymap_shape_mouseover$id
lat = uu[uu$row_num == pointId, Latitude]
lng = uu[uu$row_num == pointId, Longitude]
offset = isolate((input$mymap_bounds$north - input$mymap_bounds$south) / (23 + radius + (18 - input$mymap_zoom)^2 ))
leafletProxy("mymap") %>% addPopups(lat = lat + offset, lng = lng, as.character(pointId))
})
}
shinyApp(ui, server)