我正在构建一个闪亮的应用程序,该应用程序根据用户的选择显示一个表格。我有一个名为“ 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)
})
有人可以建议我输入正确的代码,或者告诉我是否需要进行任何更改才能使代码正常工作。
答案 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