r - 过滤器不响应我闪亮的应用程序中的应用和清除按钮
问题描述
我正在构建一个闪亮的应用程序来可视化地图上的酒店(使用传单包)。我有一个可以加载数据子集的下拉列表。除此之外,我还想在左上角构建一个过滤按钮,我可以在其中进一步按年份过滤数据。
我希望过滤器仅在我单击apply
按钮时响应。clear
另外,单击按钮后,我想清除过滤器。
下面是我闪亮的应用程序代码。好像我的apply
andclear
按钮不起作用。一旦我从过滤器下拉列表中选择一年,我的地图就会刷新。我希望它仅在单击apply
按钮后刷新。过滤器也不响应“清除”。我花了几个小时,但无法弄清楚为什么。有谁知道我做错了什么。
这是一个非常简化的版本。我的实际应用程序要复杂得多。在下拉按钮中有多个过滤器。
library(shiny)
library(leaflet)
library(shinyjs)
library(shinyWidgets)
library(dplyr)
df <- read.table(text = "Name Year Value longitude latitude
A 2020 12 -106.50645 35.06745
B 2020 33 -116.00994 36.21834
C 2020 44 -115.24685 36.29460
A 2019 55 -115.24685 35.06745
B 2019 22 -118.18642 33.98881
C 2019 11 -111.83064 35.06745",
header = TRUE)
ui <- fluidPage(
selectizeInput(inputId = 'hotel', label='Hotel Type:',
choices = c('A', 'B', 'C'),
multiple=TRUE,
options = list(
maxItems = 1,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
actionButton("load", "load"),
div(id = 'map_filter',
dropdown(
tags$h3("Filters"),
selectizeInput(inputId = 'year', label='Choose Year:',
choices = c(2020,2019),
multiple=TRUE,
options = list(
maxItems = 2,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
#uiOutput('map_zipcode_prod2ui') ,
# column(width=1, offset = 1, actionButton(inputId='map_zipcode_applyProductFilter',
# label='Apply Filter', style = 'margin-top:25px') )
actionBttn(
inputId = 'applyFilter',
label = "Apply",
style = "gradient",
color = "danger",
icon = icon("") ) ,
actionBttn(
inputId = 'clearFilter',
label = "Clear",
style = "gradient",
color = "danger",
icon = icon("") ) ,
style = "unite", icon = icon("filter"),
status = "danger", width = "300px"
) #dropdown
), #div
leafletOutput("mymap")
)
server <- function(input, output, session) {
df1 = eventReactive (input$load, {
df %>% filter(Name == input$hotel)
})
df2 = reactive({
if (length(input$year)==0) {
df2 = df1()
} else {
df2 = df1() %>% filter(Year %in% input$year)
}
})
# clear all filters
observeEvent(input$clearFilter, {
reset("map_filter")
})
observeEvent(c(input$load,input$applyFilter), ignoreInit = T, ignoreNULL = T, {
output$mymap <- renderLeaflet({
map <- leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addCircleMarkers( data = df2(),
#group = 'Data Markers 1',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'red')
})
})
}
shinyApp(ui, server)
解决方案
这是一种方法 - 希望这会有所帮助。
您可以将地图存储在reactiveVal
. 然后,您使用加载或应用过滤器按钮更新地图。否则,地图不会改变。
会考虑使用updateSelectizeInput
来清除您的过滤器。
编辑:基于评论,df1
未df2
合并。
server <- function(input, output, session) {
map <- reactiveVal(NULL)
df1 = reactive({
req(input$hotel)
filter(df, Name == input$hotel)
})
df2 = reactive({
if (length(input$year)==0) {
df2 = df1()
} else {
df2 = df1() %>% filter(Year %in% input$year)
}
})
# clear all filters
observeEvent(input$clearFilter, {
updateSelectizeInput(session, inputId = 'year', selected = "")
})
output$mymap <- renderLeaflet({
map()
})
observeEvent(c(input$load, input$applyFilter), ignoreInit = T, ignoreNULL = T, {
map(leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addCircleMarkers( data = df2(),
#group = 'Data Markers 1',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'red')
)
})
}
推荐阅读
- pyspark - 为什么 Pyspark 会抛出:“AnalysisException: `/path/to/adls/mounted/interim_data.delta` is not a Delta table”。即使文件存在......?
- javascript - 使用 reactjs 克隆 Youtube UI
- c# - C#:在自定义消息框中显示进度条变化
- reactjs - 如何返回字符串值?
- android - 无法启动活动:java.lang.NullPointerException
- python - 网络浏览器库 Python 中 autoraise 的目的/功能到底是什么?
- mysql - 在 SQL 表之间添加一行并更改以下 id
- css - 响应断点不适用于 Splide js 滑块
- azure - 我可以将 Azure APIM 配置为尊重 Cache-Control 标头吗?
- angular - Angular 模块联合单例服务多次启动