在我的闪亮应用中,我有selectInput
SITE
列出所有气象站和传单地图。按照上一个问题(How to get the zoom level from the leaflet map in R/shiny?),我可以setView
而不更改缩放级别。
现在我想添加一项新功能,以允许用户点击地图中的标记并更新selectInput
中的选定值。在我当前的代码中(请参阅下面的示例),所选的SITE
值已更新,但也请调用setView
来更改视点。
我期望的功能是1)选择新的网站更新视图,2)点击地图不会更新视图。
我怎样才能打破两个功能之间的联系?我想我可以使用isolate
来实现它。说实话,我仍然对isolate
感到困惑。
感谢您的任何建议。
这些是我的示例代码:
library(shiny)
library(leaflet)
df <- data.frame(
site = c('S1', 'S2'),
lng = c(140, 120),
lat = c(-20, -30),
stringsAsFactors = FALSE)
# Define UI for application that draws a histogram
ui <- shinyUI(fluidPage(
selectInput('site', 'Site', df$site),
leafletOutput('map')
))
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet({
leaflet() %>%
addTiles() %>%
setView(lng = 133, lat = -25, zoom = 4) %>%
addMarkers(lng = df$lng, lat = df$lat, popup = df$site)
})
observe({
sel_site <- df[df$site == input$site,]
isolate({
new_zoom <- 4
if (!is.null(input$map_zoom)) new_zoom <- input$map_zoom
leafletProxy('map') %>%
setView(lng = sel_site$lng, lat = sel_site$lat, zoom = new_zoom)
})
})
observe({
event <- input$map_marker_click
if (is.null(event))
return()
click_site <- df %>%
filter(lng == event$lng, lat == event$lat)
isolate({
updateSelectInput(session, 'site', selected = click_site$site)
})
})
})
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
这不是你要求的,因为它使用了一个按钮,但也许你可以很好地利用它。我还修复了你的过滤。
library(shiny)
library(leaflet)
df <- data.frame(
site = c('S1', 'S2'),
lng = c(140, 120),
lat = c(-20, -30),
stringsAsFactors = FALSE)
ui <- shinyUI(fluidPage(
selectInput('site', 'Site', df$site),
actionButton("center","Center map on site"),
leafletOutput('map')
))
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet({
leaflet() %>%
addTiles() %>%
setView(lng = 133, lat = -25, zoom = 4) %>%
addMarkers(lng = df$lng, lat = df$lat, popup = df$site)
})
observeEvent(input$center,{
sel_site <- df[df$site == input$site,]
isolate({
new_zoom <- 4
if (!is.null(input$map_zoom)) new_zoom <- input$map_zoom
leafletProxy('map') %>%
setView(lng = sel_site$lng, lat = sel_site$lat, zoom = new_zoom)
})
})
observe({
event <- input$map_marker_click
if (is.null(event))
return()
else{
latdist<- unlist(lapply((event$lat - df$lat), FUN=abs))
if (min(latdist)<4){
match <-
df[with(df, {which(lat[latdist==min(latdist)] == lat )
}), ]
if(abs(match$lng-event$lng)<4)
{
click_site <- df[with(df,{ which(lng == match$lng & lat == match$lat) }),]
}
updateSelectInput(session, 'site', selected = click_site$site)
}# first if
} # end else
})
})
shinyApp(ui = ui, server = server)