过滤数据表以仅列出选定的行

时间:2016-11-23 11:38:05

标签: r shiny dt

有没有办法将datatable过滤到所选行?

我有一个20000行的庞大数据框,如果你搜索并选择一些行,这有点棘手。如果要取消选择它们,则必须浏览列表并搜索已单击的行或重置完整选择。

我认为将表格过滤为仅选定的行并且用户可以再次取消选择这些行会很好。

library(shiny)
library(DT)

ui <- shinyUI(
  fluidPage(
        DT::dataTableOutput("name_table")
  )
)

server <- function(input, output, session) {
  output$name_table <- DT::renderDataTable({
    DT::datatable(mtcars,
                  options=list(pageLength=5),
                  selection=list(selected=c(1,3,32)))
  })
  name_proxy = DT::dataTableProxy('name_table')
}

shinyApp(ui, server)

所以在我的例子中,它应该将列表过滤到第1,3和32行,并且应该选择所有三个,以便我可以取消选择它们。

1 个答案:

答案 0 :(得分:0)

我不知道是否可以只使用一个表,而是通过创建包含所有选定条目的第二个表,并允许根据您(未)选择的内容更新第一个表中的选择第二个表,你得到了预期的效果。 由于表格的反应性引起了问题,我在更新选择时添加了actionButton,但我认为如果没有它,它应该是可行的。

目前,第二个表始终显示在第一个表中选择的所有行,并选择了所有行。如果要修剪选区,请在第二个表格中取消选择一行,然后按Update selections按钮

library(shiny)
library(DT)

ui <- shinyUI(
  fluidPage(
    DT::dataTableOutput("name_table"),
    DT::dataTableOutput("selected_table"),
    actionButton("selectbutton", label = "Update selections")
  )
)

server <- function(input, output, session) {
  mtcarsmod <- mtcars # We need a table with the row numbers as a column
  mtcarsmod$Rownr <- 1:nrow(mtcars)

  output$name_table <- DT::renderDataTable({
    DT::datatable(mtcarsmod,
                  options=list(pageLength=5),
                  # Have those rows selected that show up in the selected_table
                  selection= list(selected=
                                    c(1,3,32)
                  )
    )
  })

  name_proxy <- DT::dataTableProxy('name_table') # Proxy to use for updating the selection

  mtcars_selected <- reactive(mtcarsmod[input$name_table_rows_selected,]) # The selected options from the first table

  output$selected_table <- DT::renderDataTable({
    try(DT::datatable(mtcars_selected(),
                      options=list(pageLength=5),
                      # have all entries selected
                      selection= list(selected=
                                        1:nrow(mtcars_selected()))
    ))
  })


  observeEvent(input$selectbutton,  # When you press the button update the selections in the first table
               selectRows(name_proxy, mtcars_selected()[input$selected_table_rows_selected,"Rownr"])
  )

}

shinyApp(ui, server)