如何使用 ShinyDashboard 检查复选框是否被选中?

How to check if a checkbox has been selected using ShinyDashboard?

我使用 ShinyDashboard 创建了一个应用程序,其中有一个 checkboxInput。如果单击它,您将看到两个 checkboxGroupInput,您可以在其中 select 1 或 2 个选择。

这个想法是,如果您单击 1 个选项,您将使用您个人的选择对您的数据框进行子集化,或者如果您单击两个选项,您将使用这两个选项对您的数据框进行子集化。

但是,我无法验证用户 select 编辑了 checkboxGroupInput 的哪个选项。

这是一个可重现的例子。如您所见,如果两者都 select,则在第一个 if 语句中结束,对两列进行子集化。但是,如果您 select 一个选项(例如setosa),您仍然被两个子集所取代,因为它无法识别您 select 编辑的选项。但是,如果您 select "virginica" 它是子集。

而且一直出现这个警告

Warning in if (c("setosa", "virginica") %in% input$species_choice) { : the condition has length > 1 and only the first element will be used

代码:

library(shiny)
library(shinydashboard)
library(shinyWidgets)

ui <- dashboardPage(
  
  dashboardHeader(title = "Dashboard"),
  ## Sidebar content
  dashboardSidebar(
    sidebarMenu(
      menuItem("App1", tabName = "App1", icon = icon("th"))
      
    )
  ),
  
  dashboardBody(
    fluidRow(
      tabItems(
        
        tabItem(tabName = "App1",
                sidebarPanel(
                  checkboxInput(inputId = "species", label = "Select species"),
                  
                  conditionalPanel(
                    condition = "input.species",
                    style = "margin-left: 20px;",
                  
                    checkboxGroupInput("species_choice", "Choose the species:",
                                       choices = c("setosa", "virginica"), selected = c("setosa", "virginica"))),
                ),
                mainPanel(
                  dataTableOutput("table")
                  
                )
        )
      )
    )
  )
)

server <- function(input, output, session) {
  
  mytables <- reactive({
   if(input$species){
     
     df_setosa <- iris[iris$Species=="setosa",]
     df_virginica <- iris[iris$Species=="virginica",]
     df_both <- rbind(df_setosa, df_virginica)
     
     if(c("setosa", "virginica") %in% input$species_choice){
       print("both")
       return(df_both)
     }
     
     if("setosa" %in% input$species_choice){
       print("setosa")
       return(df_setosa)
     }
     
     if("virginica" %in% input$species_choice){
       print("virginica")
       return(df_virginica)
     }
   }
  })
  
  output$table <- renderDataTable({
    mytables()
  })
  
}

shinyApp(ui, server)

我也试过这种方法,但是不行:

if(input$species_choice == "setosa"){
        print("setosa")
        return(df_setosa)
      }
      
      if(input$species_choice == "virginica"){
        print("virginica")
        return(df_virginica)
      }
      
      if(input$species_choice == c("setosa, virginica"){
        print("both")
        return(df_both)
      }

请问有人知道如何帮助我吗?

提前致谢

无需在 if 条件之前对数据框进行子集化,也不需要所有这些 if 条件。您可以简单地检查是否单击了第一个按钮(我的第一个 if 条件),如果是,那么您可以使用 selected specie(s).

对数据框进行子集化

注意如果你selectnone两个物种,table是空的(但你可以改变这个行为)。

mytables <- reactive({
  if (input$species) {
    iris[iris$Species %in% input$species_choice, ]
  } else {
    iris
  }
})

我找到了另一个解决方案:

我只需要包括 if(all(c(OPTIONS) ....

library(shiny)
library(shinydashboard)
library(shinyWidgets)

ui <- dashboardPage(
  
  dashboardHeader(title = "Dashboard"),
  ## Sidebar content
  dashboardSidebar(
    sidebarMenu(
      menuItem("App1", tabName = "App1", icon = icon("th"))
      
    )
  ),
  
  dashboardBody(
    fluidRow(
      tabItems(
        
        tabItem(tabName = "App1",
                sidebarPanel(
                  checkboxInput(inputId = "species", label = "Select species"),
                  
                  conditionalPanel(
                    condition = "input.species",
                    style = "margin-left: 20px;",
                    
                    checkboxGroupInput("species_choice", "Choose the species:",
                                       choices = c("setosa", "virginica"), selected = c("setosa", "virginica"))),
                ),
                mainPanel(
                  dataTableOutput("table")
                  
                )
        )
      )
    )
  )
)

server <- function(input, output, session) {
  
  mytables <- reactive({
    if(input$species){
      
      df_setosa <- iris[iris$Species=="setosa",]
      df_virginica <- iris[iris$Species=="virginica",]
      df_both <- rbind(df_setosa, df_virginica)
      
      if(all(c("setosa", "virginica") %in% input$species_choice)){
        print("both")
        return(df_both)
      }
      
      if(all(c("setosa") %in% input$species_choice)){
        print("setosa")
        return(df_setosa)
      }
      
      if(all(c("virginica") %in% input$species_choice)){
        print("virginica")
        return(df_virginica)
      }
    }
  })
  
  output$table <- renderDataTable({
    mytables()
  })
  
}

shinyApp(ui, server)