我目前正在开发一个Shiny应用程序,该应用程序将UI中定义的过滤器应用于数据集。应用程序应用后,需要两种不同的方法来重置这些过滤器:
方法1 :可以按下 Reset 按钮,将UI元素恢复为原始状态。然后可以按下 Apply 按钮将这些UI更改应用于数据。
方法2 :重置并应用按钮,可一键执行UI元素的还原和应用于数据的操作。
我在下面包含了一个MRE应用,该应用封装了问题。可以设置MPG过滤器,然后按 Apply 应用。要再次返回未过滤的数据,方法1 可以按预期工作,在按 Reset 后再按 Apply ,将显示所有数据行。但是,方法2 需要两次单击才能显示相同的未过滤表。
我已经考虑了几种选择,包括尝试优先于在eventReactive之前发生的watchEvent调用,以及使用reactValues来存储过滤器值,但是没有运气。
任何建议或见解将不胜感激!
library(shiny)
library(dplyr)
ui <- fluidPage(
actionButton("reset_apply", label = "Reset and Apply Filter"),
br(),
actionButton("apply", label = "Apply Filter"),
actionButton("reset", label = "Reset Filter"),
sliderInput("mpg_filter",
label = "Miles per Gallon Filter",
min = min(mtcars$mpg),
max = max(mtcars$mpg),
value = c(min(mtcars$mpg),
max(mtcars$mpg))),
tableOutput("table")
)
server <- function(input, output, session) {
observeEvent(input$reset | input$reset_apply, {
updateSliderInput(session, "mpg_filter",
min = min(mtcars$mpg),
max = max(mtcars$mpg),
value = c(min(mtcars$mpg), max(mtcars$mpg)))
})
data <- eventReactive(input$apply | input$reset_apply, {
mtcars %>%
filter(
between(mpg, input$mpg_filter[1], input$mpg_filter[2])
)
})
output$table <- renderTable({
data()
})
}
shinyApp(ui, server)
由reprex package(v0.3.0)于2020-10-26创建