【问题标题】:shiny R either or filter with two inputs闪亮的 R 或带有两个输入的过滤器
【发布时间】:2018-08-09 10:08:25
【问题描述】:

我创建了一个闪亮的应用程序并希望实现一个“非此即彼”过滤器。

假设所有内容都已预先选择,因此表格完全显示。如果我选择一个过滤器,则另一个过滤器将被忽略/忽略/无效/...

例如,我选择 'gears' = 3 并且 'carb' 为空。比我添加 'gears' = 4。之后我选择 'carb' = 1 并且 'gear' 过滤器为空。

也许有人可以帮助我。我正在解决这个问题。我想我需要使用reactiveeventReactive 或其他类型的reactive-表达式。但也许这里有人有一个想法。

library(shiny)
library(shinyWidgets)

data(mtcars)
allcarbs <- sort(unique(mtcars$carb))
allgears <- sort(unique(mtcars$gear))

ui <- fluidPage(

  pickerInput(inputId = "carbinput",
              label = h4("carb"),
              choices = allcarbs,
              selected = allcarbs,
              multiple = TRUE, options = list('actions-box' = TRUE)),

  h4("or"),

  pickerInput(inputId = "gearinput", 
              label = h4("gears"), 
              choices = allgears, 
              selected = allgears, 
              multiple = TRUE, options = list('actions-box' = TRUE)),

  tableOutput("mtcarstab")
)

server <- function(input, output, session) {

  output$mtcarstab <- renderTable({
    subset(mtcars, 
           gear %in% as.numeric(input$gearinput) |
             carb %in% as.numeric(input$carbinput))
  })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny filtering


    【解决方案1】:

    一个简单的解决方案:

    在声明服务器或 UI 之前,创建响应式值

    vals=reactiveValues(carb=FALSE,gear=FALSE)

    然后您可以使用 observeEvent 在您的服务器上更改它们:

    observeEvent(input$gearinput,{
    vals$gear=TRUE
    vals$carb=FALSE
    })
    
    observeEvent(input$carbinput,{
    vals$gear=FALSE
    vals$carb=TRUE
    })
    
    mytable=eventReactive(c(vals$gear,vals$carb,input$carb,input$gear),{
    if(vals$carb){return(subset(mtcars, 
               carb %in% as.numeric(input$carbinput)))}
    else{return(subset(mtcars, 
               gear %in% as.numeric(input$gearinput)))}
    })
    
      output$mtcarstab <- renderTable({
        mytable()
      })
    

    编辑: 我将 cmets 编辑为答案,使其 100% 正确。

    【讨论】:

    • 这很有帮助。我不知道uiserver 之外的reactiveValues。但它只解决了 80%。只有当我在input$carbinputinput$gearinput 之间切换时,它才会更改过滤器输入。当我,例如选择齿轮中的数字 4,然后表格改变,当我添加 3 时,id 不再改变。我猜添加值不算作事件,observerEvent(input$gearinput 不会触发
    • 只需添加到 reactiveEvent c(vals$gear,vals$carb,input$carb,input$gear) 就可以解决问题,对吧?
    • 这就像一个魅力。但这是为什么呢? eventReactive() 对多个更改做出反应,而 observerEvent 不是?
    • 两者都会对其参数内部的变化做出反应。注意观察者和 eventReactive 内部的区别。例如,您可以声明多个触发器来观察事件,例如 observeEvent(c(arg1,arg2),{do(this)})
    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 2020-08-18
    • 2015-01-19
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多