R闪亮的动态DT数据表记住过滤器/排序
Posted
技术标签:
【中文标题】R闪亮的动态DT数据表记住过滤器/排序【英文标题】:R Shiny dynamic DT Datatable remember filters/sorting 【发布时间】: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)
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于R闪亮的动态DT数据表记住过滤器/排序的主要内容,如果未能解决你的问题,请参考以下文章
调整/更新过滤器选择以适应闪亮的 DT 数据表中已应用的过滤器
错误:所有观察都在同一组中,同时从闪亮的 ui 列表中动态过滤 R 模型