在反应性光泽中实现“全选”选项

时间:2019-05-27 04:15:45

标签: r datatable shiny interactive selectall

我正在构建一个闪亮的应用程序,该应用程序根据用户的选择显示一个表格。我有一个名为“ stat”的表,其格式为

Team      Season   wins  loss  draws
Arsenal   1992-93   18    12    14
Arsenal   1993-94   21    10    7 
Liverpool 1992-93   22    6     12
Liverpool 1993-94   19    13    10
 All        All     0     0     0

我需要根据所选球队和赛季来过滤数据。当为季节选择“全部”时,该表应显示所有季节的数据,反之亦然。

我尝试了下面的一些代码,但未按预期工作。

#UI part
selectInput("club", "Select Club", choices = stat$Team),
                 selectInput("season", "Select Season", choices = 
 stat$Season)

#server part
server <- output$statdata <- renderTable({
  teamfilter <- subset(stat, (stat$Team == input$club) & 
                         (stat$Season==input$season))
})

  observe({
    if("Select All" %in% input$club)
      selected_choices = stat$Team[-1]
    else
      selected_choices = input$club
    updateSelectInput(session, "club", selected = selected_choices)

})

有人可以建议我输入正确的代码,或者告诉我是否需要进行任何更改才能使代码正常工作。

1 个答案:

答案 0 :(得分:1)

这是一个完整的示例,展示了如何将“全部”合并到selectInput中:

library(shiny)
dat <- mtcars
app <- shinyApp(
  ui = shinyUI(
    pageWithSidebar(
      headerPanel("Simple Test"),
      sidebarPanel(
        selectInput("cyl", "Cylinders", choices = c("All", sort(unique(dat$cyl)))),
        selectInput("gear", "Gears", choices = c("All", sort(unique(dat$gear))))
      ),
      mainPanel(
        shiny::tableOutput("out")
      )
    )
  ),
  server = function(input, output, session) {
    filtered <- reactive({
      rows <- (input$cyl == "All" | dat$cyl == input$cyl) &
        (input$gear == "All" | dat$gear == input$gear)
      dat[rows,,drop = FALSE]
    })
    output$out <- renderTable(filtered())
  }
)

这利用了R的回收:input$gear == "All"返回单个逻辑,而dat$gear == input$gear返回一个向量,只要表中的行数为准。因为第一个逻辑的长度为1,所以它与第二个向量一样长。这意味着input$gear == "All"实际上是长度为“ nrow(dat)”的向量,并且始终是所有TRUE或全部FALSE。如果为true,则其他所有$gear比较都无关紧要(我正在掩盖NA的比较);如果为假,则其他$gear比较是相关的。

回收示范:

1 == 1
# [1] TRUE
1 == 2
# [1] FALSE

1 == 1:5
# [1]  TRUE FALSE FALSE FALSE FALSE

1 == 1 | 1 == 1:5
# [1] TRUE TRUE TRUE TRUE TRUE
1 == 2 | 1 == 1:5
# [1]  TRUE FALSE FALSE FALSE FALSE