R Shiny Leaflet - clearShapes()不起作用?
R Shiny Leaflet - clearShapes() not working?
我有一个形式的数据集 (tst_geo.csv):
lat, lon, time
10, 20, 1
10, 20, 2
10, 20, 3
40, 40, 4
40, 40, 5
40, 40, 6
0, 0, 7
0, 0, 8
0, 0, 9
R代码:
library(shiny)
library(leaflet)
library(plyr)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("slider")
),
mainPanel(
leafletOutput("map")
)
)
)
server <- function(input, output, session){
df <- read.csv("tst_geo.csv", header=TRUE)
df['time'] <- as.numeric(df$time)
#make dynamic slider
output$slider <- renderUI({
sliderInput("time_span", "Time Span", step=1, min=min(df$time),
max=max(df$time), value = c(min(df$time), max(df$time)))
})
filter_df <- reactive({
df[df$time >= input$time_span[1] & df$time <= input$time_span[2], ]
})
output$map <- renderLeaflet(
leaflet() %>% addTiles()
)
observe({
points_df <- ddply(filter_df(), c("lat", "lon"), summarise, count = length(timestamp))
cat(nrow(points_df))
leafletProxy("map", data = points_df) %>% clearShapes() %>% addCircles()
})
}
shinyApp(ui, server)
我有一个滑块只显示特定时间范围内的点数。
但是,在 observe
函数内部,当我调用 clearShapes()
.
时,点数没有被清除
知道为什么会这样吗?
在这种情况下,罪魁祸首是 renderUI()
。因为你使用了renderUI()
,滑块的渲染被延迟了。当观察者第一次运行时,滑块还不存在,input$time_span
最初是 NULL
,所以 filter_df()
returns 是一个空数据框。我没有看到在这种情况下使用 renderUI()
的特殊原因(也许你有理由),你可以将 sliderInput()
移动到 ui.R,或者检查 if (is.null(input$time_span))
在向地图添加圆之前,或将 observe()
更改为 observeEvent()
(如果您使用的是 shiny 的最新版本):
observeEvent(input$time_span, {
points_df <- ddply(filter_df(), c("lat", "lon"), summarise, count = length(timestamp))
cat(nrow(points_df))
leafletProxy("map", data = points_df) %>% clearShapes() %>% addCircles()
})
我有一个形式的数据集 (tst_geo.csv):
lat, lon, time
10, 20, 1
10, 20, 2
10, 20, 3
40, 40, 4
40, 40, 5
40, 40, 6
0, 0, 7
0, 0, 8
0, 0, 9
R代码:
library(shiny)
library(leaflet)
library(plyr)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("slider")
),
mainPanel(
leafletOutput("map")
)
)
)
server <- function(input, output, session){
df <- read.csv("tst_geo.csv", header=TRUE)
df['time'] <- as.numeric(df$time)
#make dynamic slider
output$slider <- renderUI({
sliderInput("time_span", "Time Span", step=1, min=min(df$time),
max=max(df$time), value = c(min(df$time), max(df$time)))
})
filter_df <- reactive({
df[df$time >= input$time_span[1] & df$time <= input$time_span[2], ]
})
output$map <- renderLeaflet(
leaflet() %>% addTiles()
)
observe({
points_df <- ddply(filter_df(), c("lat", "lon"), summarise, count = length(timestamp))
cat(nrow(points_df))
leafletProxy("map", data = points_df) %>% clearShapes() %>% addCircles()
})
}
shinyApp(ui, server)
我有一个滑块只显示特定时间范围内的点数。
但是,在 observe
函数内部,当我调用 clearShapes()
.
知道为什么会这样吗?
在这种情况下,罪魁祸首是 renderUI()
。因为你使用了renderUI()
,滑块的渲染被延迟了。当观察者第一次运行时,滑块还不存在,input$time_span
最初是 NULL
,所以 filter_df()
returns 是一个空数据框。我没有看到在这种情况下使用 renderUI()
的特殊原因(也许你有理由),你可以将 sliderInput()
移动到 ui.R,或者检查 if (is.null(input$time_span))
在向地图添加圆之前,或将 observe()
更改为 observeEvent()
(如果您使用的是 shiny 的最新版本):
observeEvent(input$time_span, {
points_df <- ddply(filter_df(), c("lat", "lon"), summarise, count = length(timestamp))
cat(nrow(points_df))
leafletProxy("map", data = points_df) %>% clearShapes() %>% addCircles()
})