【发布时间】:2018-10-17 15:36:19
【问题描述】:
在下面的代码中,小册子 addCircles 在缩放更改后被绘制了两次。我认为这种双重绘图的发生是因为创建数据框的反应总是随着缩放的变化而更新。但是,我只希望在超过缩放阈值时更新反应数据框(race.dots.all.r)。有任何想法吗?
编辑:我删除了更多代码以简化并通过向数据添加 Dropbox 链接使其可重现。
library(shiny)
library(leaflet)
library(dplyr)
load(url("https://www.dropbox.com/s/umhqvoqvbhlkrc6/shiny_app_seg_gap_stackoverflow.RData?dl=1"))
ui <- shinyUI(fluidPage(
leafletOutput("map"),
checkboxInput("togglewhite", "White", value = TRUE)
))
server <- shinyServer(function(input, output, session) {
per.person <- eventReactive(input$map_zoom,{
new_zoom <- 12
if (!is.null(input$map_zoom)) {
new_zoom <- input$map_zoom}
if ( new_zoom < 13 ) {
per.person <- "1000"
} else {
per.person <- "250"
}
return(per.person)
})
race.dots.all.r <- eventReactive(per.person(),{
race.dots.all <- race.dots.all[[per.person()]]
return(race.dots.all)
})
values <- reactiveValues(school = NULL)
output$map <- renderLeaflet({
leaflet(options = leafletOptions(preferCanvas = TRUE)) %>%
addProviderTiles("CartoDB") %>%
setView(lat=40.73771, lng=-74.18958, zoom = 8)
})
observeEvent(c(input$togglewhite, race.dots.all.r()), {
proxy <- leafletProxy('map')
proxy %>% clearGroup(group = "White")
if (input$togglewhite){
race.dots.all.selected.race <- dplyr::filter( race.dots.all.r(), group == "White")
proxy %>% addCircles(group = race.dots.all.selected.race$group,
race.dots.all.selected.race$lng,
race.dots.all.selected.race$lat)
}
},ignoreInit = TRUE)
}) # close server
shinyApp(ui, server)
【问题讨论】:
-
为什么绘制的数据首先依赖于缩放?您是否特别打算仅在用户放大/缩小到一定程度时才绘制某些内容?
-
@Shree:第一次绘制数据时,不需要依赖缩放。但是,如果用户缩小我希望显示的点更少。这是为了 (a) 使其绘图速度更快,以及 (b) 更改可视化效果,使点不会相互重叠。与 (b) 相关,我计划在缩小时更改权重,以便 circleMarkers 也发生变化。
标签: r shiny leaflet react-leaflet r-leaflet