我创建了一个闪亮的应用程序,并希望实现“任一或”过滤器。
假设所有内容都已预先选中,因此表格会完全显示。如果我选择一个过滤器,则其他过滤器被解除/忽略/无效/ ...
例如,我选择'齿轮'= 3并且'碳水化合物'被取消。比我添加'齿轮'= 4.之后我选择'carb'= 1并且'齿轮'过滤器被取消。
也许有人可以帮助我。我正在解决这个问题。我想我需要使用reactive
或eventReactive
或其他一些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)
简单的解决方案:
在声明服务器或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%正确。