闪亮的R或两个输入过滤器

时间:2018-03-01 10:49:46

标签: r shiny filtering

我创建了一个闪亮的应用程序,并希望实现“任一或”过滤器。

假设所有内容都已预先选中,因此表格会完整显示。如果我选择一个过滤器,则其他过滤器被解除/忽略/无效/ ... /

例如,我选择'齿轮'= 3并且'碳水化合物'被取消。比我添加'齿轮'= 4.之后我选择'carb'= 1并且'齿轮'过滤器被取消。

也许有人可以帮助我。我正在解决这个问题。我想我需要使用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)

1 个答案:

答案 0 :(得分:3)

一个简单的解决方案:

在声明服务器或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()
  })

修改 我将评论编辑成答案,使其100%正确。