【问题标题】:R Shiny dynamic DT Datatable remember filters/sortingR闪亮的动态DT数据表记住过滤器/排序
【发布时间】:2018-02-13 14:28:37
【问题描述】:

我正在使用DT 包构建一个带有动态数据表的R Shiny 应用程序。用户可以在包含更多列的 data.frame 中选择两列。

当用户选择一列时,数据表会更新,并且数据表对象内的所有过滤器/排序都会重置为默认值。当用户没有替换给定列时,如何让应用程序记住过滤器和排序?

下面的最小工作示例:

library(shiny)
library(DT)
library(data.table)


server <- function(input, output) {

  df <- data.frame(
    name = rep('a',20),
    dimA = 1:20,
    dimB = 21:40,
    dimC = 41:60
  )

  observe({
    columns <- c('name', input$dim1ID, input$dim2ID)
    dfDt <- df[names(df) %in% columns]

    output$dtDataTable = DT::renderDataTable(
      server = FALSE,

      expr = datatable(
        dfDt,
        filter = 'top',
        rownames = FALSE,
        selection = 'none',
        options = list(sDom  = '<"top">rt<"bottom">ip')
      )
    )
  })
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      ## Dimension 1
      selectInput(
        inputId = "dim1ID",
        label = "Dimensie 1",
        choices = c('dimA', 'dimB', 'dimC'),
        selected = 'dimA'
      ),
      ## Dimension 2      
      selectInput(
        inputId = "dim2ID",
        label = "Dimensie 2",
        choices = c('dimA', 'dimB', 'dimC'),
        selected = 'dimB'
      )
    ),
    mainPanel(DT::dataTableOutput('dtDataTable'))
  )
)

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r datatable shiny


    【解决方案1】:

    这可以使用DataTables Information来完成,特别是“状态”信息(input$tableId_state)包含当前表的订单信息,input$tableId_search_columns包含按列过滤的信息。如果列是固定的(即在上面的示例中,“Dimensie 1”和“Dimensie 2”总是在同一个位置),“记住”哪个列被排序要简单得多(与原始示例不同,它们是按字母顺序排列的创建表时重新排序)。例如,基于上述示例,如果您对“A”列进行排序并将右列从“B”更改为“C”并返回,则以下操作将起作用:

    library(shiny)
    library(DT)
    library(data.table)
    
    
    server <- function(input, output) {
        
        df <- data.frame(
            name = rep('a',20),
            dimA = 1:20,
            dimB = 21:40,
            dimC = 41:60
        )
        
        values <- reactiveValues(
            prevDim1 = "",
            prevDim2 = "",
            options = list(sDom  = '<"top">rt<"bottom">ip',
                           stateSave = TRUE,
                           order = list())
        )
        
        observeEvent(input$dtDataTable_state$order, {
            values$options$order <- input$dtDataTable_state$order
        })
        
        observeEvent({
            input$dim1ID
            input$dim2ID
        },{
            columns <- c('name', input$dim1ID, input$dim2ID)
            dfDt <- df[names(df) %in% columns]
            
            if(length(values$options$order) != 0 && ((values$prevDim1 != input$dim1ID && values$options$order[[1]][[1]] == 1) | (values$prevDim2 != input$dim2ID && values$options$order[[1]][[1]] == 2)) ){
                values$options$order = list()
            }
            
            values$prevDim1 <- input$dim1ID
            values$prevDim2 <- input$dim2ID
            
            output$dtDataTable = DT::renderDataTable(
                server = FALSE,
                
                expr = datatable(
                    dfDt,
                    filter = 'top',
                    rownames = FALSE,
                    selection = 'none',
                    options = values$options
                )
            )
        })
    }
    
    ui <- fluidPage(
        sidebarLayout(
            sidebarPanel(
                ## Dimension 1
                selectInput(
                    inputId = "dim1ID",
                    label = "Dimensie 1",
                    choices = c('dimA', 'dimB', 'dimC'),
                    selected = 'dimA'
                ),
                ## Dimension 2      
                selectInput(
                    inputId = "dim2ID",
                    label = "Dimensie 2",
                    choices = c('dimA', 'dimB', 'dimC'),
                    selected = 'dimB'
                )
            ),
            mainPanel(DT::dataTableOutput('dtDataTable'))
        )
    )
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2015-09-28
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多