Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to display data table in r shiny with selectInput(multiple = T)?

I would like to allow multiple selection in my shiny app, and display the filtered dataset.
The code is as below:

library(shiny)
library(ggplot2)  
library(dplyr)  

result_table  = mtcars

fluidPage(
  tabsetPanel(
    tabPanel("Import data",
      titlePanel("Test"),
      
      # Create a new Row in the UI for selectInputs
      fluidRow(
        column(4,
               selectInput("cyl",
                           "cyl:",
                           c("All",
                             unique(as.character(result_table$cyl)))
                          )
        ),
        column(4,
               selectInput("vs",
                           "vs:",
                           c("All",
                             unique(as.character(result_table$vs))),
                           multiple = T)
        ),
        
      ),
      # Create a new row for the table.
      DT::dataTableOutput("table")
    ),
    tabPanel("test2",
      titlePanel("test"),
      
      # Create a new Row in the UI for selectInputs
      fluidRow(
        column(4,
               selectInput("cyl",
                           "cyl:",
                           c("All",
                             unique(as.character(result_table$cyl)))
                          )
        ),
        column(4,
               selectInput("vs",
                           "vs:",
                           c("All",
                             unique(as.character(result_table$vs))),
                           multiple = T)
        ),
      )
   )
 )
)


# Load the ggplot2 package which provides
# the 'mpg' dataset.
library(ggplot2)

function(input, output) {
  
  # Filter data based on selections
  output$table <- DT::renderDataTable(DT::datatable({
    data <- result_table 
    if (input$cyl!= "All") {
      data <- data[data$cyl== input$cyl,]
    }
    if (!(input$vs%in%  "All")) {
      data <- data[(data$vs%in% input$vs),]
    }
    data
  }))
  
}

When I run the code, the following error popped up:
enter image description here

I suspected that the error appeared because of if function in the server side…But I cannot figure out the reason. Maybe the format of input is not the same as data?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Please give me some suggestions. Thank you.

>Solution :

There are two issues with your code. First, when using multiple=TRUE the selected= argument defaults to no value. That’s why you an error as input$vs is NULL when you start your app. To prevent that set a selected value or account for the case of a NULL value in your server. Second, all input ids have to be unique, whereas you used the same ids for the selectInputs in both tabPanels. Hence, I renamed them to XXX2.

library(shiny)

result_table <- mtcars

ui <- fluidPage(
  tabsetPanel(
    tabPanel(
      "Import data",
      titlePanel("Test"),

      # Create a new Row in the UI for selectInputs
      fluidRow(
        column(
          4,
          selectInput(
            "cyl",
            "cyl:",
            c(
              "All",
              unique(as.character(result_table$cyl))
            )
          )
        ),
        column(
          4,
          selectInput("vs",
            "vs:",
            c(
              "All",
              unique(as.character(result_table$vs))
            ),
            selected = "All",
            multiple = TRUE
          )
        ),
      ),
      # Create a new row for the table.
      DT::dataTableOutput("table")
    ),
    tabPanel(
      "test2",
      titlePanel("test"),
      fluidRow(
        column(
          4,
          selectInput(
            "cyl2",
            "cyl:",
            c(
              "All",
              unique(as.character(result_table$cyl))
            )
          )
        ),
        column(
          4,
          selectInput("vs2",
            "vs:",
            c(
              "All",
              unique(as.character(result_table$vs))
            ),
            selected = "All",
            multiple = TRUE
          )
        ),
      )
    )
  )
)

server <- function(input, output) {
  # Filter data based on selections
  output$table <- DT::renderDataTable(DT::datatable({
    data <- result_table
    if (input$cyl != "All") {
      data <- data[data$cyl == input$cyl, ]
    }
    if (!(input$vs %in% "All")) {
      data <- data[data$vs %in% input$vs, ]
    }
    data
  }))
}

shinyApp(ui, server)
#> 
#> Listening on http://127.0.0.1:8331

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading