简体   繁体   中英

Use Shiny ActionButton to select all rows or add all rows to selection in current view with filtering in a DT datatable

  1. I have been trying to create ActionButtons to allow a user to 'Select all rows in view' in a reactive, filtering datatable.

Currently the button does this using tableid_rows_current; however, I also want to add in a table proxy so that it doesn't reset to the first page of results if you're on another page, but I can't figure out the syntax after much googling (see attempts commented out in code). Also if you manually select some rows, it no longer works.

  1. Another ActionButton that allows a user to 'add all rows in view to selection'. That is to add all current rows in view to your previous selection. This one I'm not even sure where to start, so any ideas are appreciated.

(Not included here, but I do have functioning 'clear selection' and 'clear filter' buttons already, if anyone is interested)

Minimum reproducible code below. The app is meant to display the images for the selected rows, but not a big deal here that you won't have actual images displaying.

library(DT)
library(shiny)

dat <- data.frame(
  type = c("car", "truck", "scooter", "bike"),
  frontimage = c("carf.jpg", "truckf.jpg", "scooterf.jpg", "bikef")
)
  
# ----UI----
ui <- fluidPage(
  titlePanel("Buttons 'select all' and 'add to select'"),
  
  mainPanel(
    DTOutput("table"),
    actionButton("select_all_current", "Select All Rows in View"),
    actionButton("add_to_selection", "Add All Rows in View to Selection"),
    uiOutput("img1")
  )
)

# ----Server----
server = function(input, output, session){
  
  # Action button to select all rows in current view
  var <- reactiveValues()
  tableProxy <- dataTableProxy('table')
  
  observeEvent(input$select_all_current, {
    print("select_all_current")
    # tableProxy %>% selectRows(1:nrow(input$table_rows_current))
    # var$selected <- tableProxy %>% input$table_rows_current
    
    tableProxy <- #I want the table proxy to be whatever the current selection and filters are and the current page view to stay the same after selecting
      var$selected <- input$table_rows_current
  })
  
  # Action button to add all rows in current view to previous selection
  observeEvent(input$add_to_selection, {
    print("select_all_current")
    
  })
  
  # Data table with filtering
  output$table = DT::renderDT({
    datatable(dat, filter = list(position = "top", clear = FALSE), 
              selection = list(target = 'row', selected = var$selected),
              options = list(
                autowidth = TRUE,
                pageLength = 2,
                lengthMenu = c(2, 4)
              ))
  })
  
  # Reactive call that only renders images for selected rows 
  df <- reactive({
    dat[input[["table_rows_selected"]], ]
  })
  
  # Front image output
  output$img1 = renderUI({
    imgfr <- lapply(df()$frontimage, function(file){
      tags$div(
        tags$img(src=file, width="100%", height="100%")
      )
      
    })
    do.call(tagList, imgfr)
  })

}
# ----APP----    
# Run the application 
shinyApp(ui, server)

Does this do what you're looking for?

library(DT)
library(shiny)

dat <- data.frame(
  type = c("car", "truck", "scooter", "bike"),
  frontimage = c("carf.jpg", "truckf.jpg", "scooterf.jpg", "bikef")
)

# ----UI----
ui <- fluidPage(
  titlePanel("Buttons 'select all' and 'add to select'"),
  
  mainPanel(
    DTOutput("table"),
    actionButton("select_all_current", "Select All Rows in View"),
    actionButton("add_to_selection", "Add All Rows in View to Selection"),
    uiOutput("img1")
  )
)

# ----Server----
server = function(input, output, session){
  
  # Action button to select all rows in current view
  var <- reactiveValues()
  tableProxy <- dataTableProxy('table')
  
  observeEvent(input$select_all_current, {
    print("select_all_current")
    # tableProxy %>% selectRows(1:nrow(input$table_rows_current))
    # var$selected <- tableProxy %>% input$table_rows_current
    
    # tableProxy <- #I want the table proxy to be whatever the current selection and filters are and the current page view to stay the same after selecting
      # var$selected <- input$table_rows_current
    selectRows(proxy = tableProxy,
               selected = input$table_rows_current)
  })
  
  # Action button to add all rows in current view to previous selection
  observeEvent(input$add_to_selection, {
    print("select_all_current")
    
    selectRows(proxy = tableProxy,
               selected = c(input$table_rows_selected, input$table_rows_current))
    
  })
  
  # Data table with filtering
  output$table = DT::renderDT({
    datatable(dat, filter = list(position = "top", clear = FALSE), 
              selection = list(target = 'row'),#, selected = var$selected),
              options = list(
                autowidth = TRUE,
                pageLength = 2,
                lengthMenu = c(2, 4)
              ))
  })
  
  # Reactive call that only renders images for selected rows 
  df <- reactive({
    dat[input[["table_rows_selected"]], ]
  })
  
  # Front image output
  output$img1 = renderUI({
    imgfr <- lapply(df()$frontimage, function(file){
      tags$div(
        tags$img(src=file, width="100%", height="100%")
      )
      
    })
    do.call(tagList, imgfr)
  })
  
}
# ----APP----    
# Run the application 
shinyApp(ui, server)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM