DT::renderDataTable 过滤器在数据动态更新时不起作用

问题描述 投票:0回答:1

我正在尝试使用单选按钮动态更新数据帧的内容。对于用例,考虑在英语和西班牙语之间更改表中数据的语言。我发现当数据动态更新时,不会构建过滤器。我想出的唯一半途而废的解决方案:

  1. 使用这篇文章作为参考构建过滤器功能。需要客户端处理,这并不理想(相当大的数据集)。
  2. 构建多个单独的表并有选择地切换可见性,以便仅显示当前活动表(未经测试,但似乎可能,尽管不切实际)。

也许有更好的解决方案?我愿意接受建议。下面是数据更改时过滤器功能中断的最小可重现示例。请注意,column_list 中的所有列都会动态更改(附加“X”),并且过滤器在这些列中不再起作用。

library(shiny)
library(DT)
library(htmltools)

d <- iris

ui <- fluidPage(
  DTOutput("dtable")
)

server <- function(input, output, session){

  d_col_rct <- reactive({
    sub_regex = "X$|$"
    column_list <- list("Sepal.Length", "Petal.Length", "Species")
    for(column in column_list) {
      d[[column]] <- sub(sub_regex, "X", d[[column]], perl=TRUE)
      if(is.factor(d[[column]])) {
        d[[column]] <- droplevels(d[[column]]) 
      }
    }
    d
  })

  output[["dtable"]] <- DT::renderDataTable(
    {
      d_col_rct()
    },
    filter="top",
    rownames=FALSE,
    style="bootstrap",
    selection=list(
      mode="single",
      target="column",
      selected=0
    ),
    extensions = c("ColReorder"),
    options = list(
      dom = 'Blfrtip',
      autoWidth=FALSE,
      orderMulti=TRUE,
      searching=TRUE,
      search.regex=TRUE,
      lengthMenu=list(c(10,25,50,100,100), c('10','25', '50', '100', '1000')),
      pageLength=25
    )
  )
}

shinyApp(ui, server)
r shiny dt
1个回答
0
投票

列必须是

factor
才能拥有过滤器:

  d_col_rct <- reactive({
    sub_regex = "X$|$"
    column_list <- list("Sepal.Length", "Petal.Length", "Species")
    for(column in column_list) {
      d[[column]] <- sub(sub_regex, "X", d[[column]], perl=TRUE)
      d[[column]] <- as.factor(d[[column]]) 
    }
    d
  })
© www.soinside.com 2019 - 2024. All rights reserved.