我认为您的代码有几个问题。由于我们不知道原始数据,我展示了一个带有 iris 数据集的示例。它应该很容易适应您的问题。
library(shiny)
library(dplyr)
myiris <- mutate(iris, Species = as.factor(Species))
shinyApp(
ui = fluidPage(
selectInput(inputId = "select",
label = "Choose subset of analysis",
choices = c("all", levels(myiris$Species)),
selected = "all"),
verbatimTextOutput("summary")
),
server = function(input, output) {
datasetInput <- reactive({
req(input$select)
filter(myiris, input$select == "all" | Species == input$select)
# alternatively `subset` works as well:
# subset(myiris, input$select == "all" | Species == input$select)
})
output$summary <- renderText(summary(datasetInput()))
})
为什么filter(myiris, input$select == "all" | Species == input$select) 有效?
filter 和 subset 将表达式作为第二个参数。重要的是
- 这可以是任何逻辑表达式。表达式不一定需要引用列名。
- 如果表达式与
data.frame 的行数不匹配,则表达式将被重新循环。注意subset 和filter 有不同的回收规则。但是,两者都会将length == 1 的表达式循环到data.frame 的行数。
- 表达式可能包含布尔运算符(
&、| 等)
考虑到这一点,我们可以构造表达式:
input$select == "all" | Species == input$select
由于input$select == "all" 属于length == 1,它将被回收以匹配Species == input$select 中的元素数,即data.frame 的行数。
由于我们使用A或Operator |,因此在选择all时,表达式将在TRUE 987654339 @。如果未选择all,则表达式Species == input$select 将为与所选input$select 匹配的所有行的TRUE。