shiny allowling users to choose which columns to d

2019-02-11 07:53发布

问题:

I am dabbling with the datatable feature in shiny and I am interested in creating a wellpanel or a sidepanel that lists all the columns of a datatable and allows users to choose which columns they want to see on the datatable.

Right now this code below displays all the columns of toy dataset mtcars

library(shiny)

runApp(list(
  ui = basicPage(
    h2('The mtcars data'),
    dataTableOutput('mytable')
  ),
  server = function(input, output) {
    output$mytable = renderDataTable({
      mtcars
    })
  }
))

I am interested in providing the users the ability to turn these columns either on or off using a checkbox

  [1] "mpg"  "cyl"  "disp" "hp"   "drat"
  [6] "wt"   "qsec" "vs"   "am"   "gear"
  [11] "carb"

Any help on addressing this issue is much appriciated. Thanks in advance.

回答1:

My example uses checkboxGroupInput to select multiple columns

library(shiny)

vchoices <- 1:ncol(mtcars)
names(vchoices) <- names(mtcars)

runApp(list(
  ui = basicPage(
    h2('The mtcars data'),
    checkboxGroupInput("columns","Select Columns",choices=vchoices,inline = T),
    dataTableOutput('mytable')


  ),
  server = function(input, output) {

    observeEvent(input$columns,{
      cols <- as.numeric(input$columns)
      if(length(input$columns) == 1){
        df <- data.frame(mtcars[,cols])
        names(df) <- names(mtcars)[cols]
        output$mytable = renderDataTable(df)

      }else{
        output$mytable = renderDataTable(mtcars[,cols])

      }


    })

  }
))


回答2:

Here is an example. It uses selectInput to select columns, and displays all columns by default until you select one or more specific columns.

library(shiny)
runApp(list(
  ui = basicPage(
    selectInput("select", "Select columns to display", names(mtcars), multiple = TRUE),
    h2('The mtcars data'),
    dataTableOutput('mytable')
  ),
  server = function(input, output) {
    output$mytable = renderDataTable({
      columns = names(mtcars)
      if (!is.null(input$select)) {
        columns = input$select
      }
      mtcars[,columns,drop=FALSE]
    })
  }
))