R闪亮:observeEvent和eventReactive与重叠的操作按钮

时间:2020-10-26 14:54:05

标签: r shiny

我目前正在开发一个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创建

0 个答案:

没有答案