交互式数据表:重新渲染表后保留列过滤器

Bal*_*ter 5 javascript r datatables shiny

第一次海报在这里。我通常能够在不发布的情况下获得我所有的答案,但这真的让我很难过。我是一个没有任何 JavaScript 经验的中级 R 用户。这是我想要做的:

我有一个数据表,它通过操作按钮使用交互式闪亮过滤器,这些按钮对我的数据进行子集化,以及内置的数据表过滤器。操作按钮通过对数据框进行子集化来执行批量过滤。我遇到的问题是,无论何时应用这些批量过滤器之一,都会重新呈现数据表并清除所有单独的列过滤器。我希望能够在数据子集化和表重新呈现时保持单个列过滤器处于活动状态。

我设法发现我可以使用 input$mytable_search_columns 从数据表中输出和隔离此信息,但我不知道如何编写在重新渲染表时应用此条件的 javascript。

library(shinyBS)
library(DT)

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

  df <- reactive({iris})

  df.sub <- reactive({
    if(input$buttonfilter == 0){
      df.sub <- df()
    }
    if(input$buttonfilter == 1){
      df.sub <- subset(df(), subset = Species == 'setosa')
    }
    df.sub
  })

  output$mytable <- DT::renderDataTable(df.sub(),
                                        filter = 'top')
  output$filters <- renderText({input$mytable_search_columns})
}
ui <- fluidPage(
  h3('Button Toggle Filter'),
  bsButton("buttonfilter","Show only Setosa", type = 'toggle'),
  br(),
  br(),
  h3('Current filters'),
  textOutput('filters'),
  br(),
  br(),
  DT::dataTableOutput('mytable')



)

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

非常感谢。

编辑:

好的,我已经做到了,它应该是可重现的(需要shinyBS 和 DT 包)。

我正在尝试做的是找到一种方法来在基于操作按钮启动的子集重新呈现表时维护当前的 DT 过滤器。在此示例中,您可以看到重新渲染表后过滤器被清除。

谢谢!

Mar*_*zer 4

我找到了一种不使用 JavaScript 的方法。我真的很惊讶它有效。我从来没有处理过 DT 包,但我认为这就是你想要的:

library(shinyBS)
library(DT)

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

  df <- reactive({
    if(input$buttonfilter %% 2 == 0){
      df.sub <- iris
    } else {
      df.sub <- subset(iris, subset = Species == 'setosa')
    }
    df.sub
  })


  output$mytable <- DT::renderDataTable(isolate(df()), filter = 'top')
  proxy <- dataTableProxy('mytable')

  observe({
    replaceData(proxy, df(), resetPaging = FALSE)
  })  
}

ui <- fluidPage(h3('Button Toggle Filter'),
                bsButton("buttonfilter","Show only Setosa", type = 'toggle'),
                br(),br(),
                DT::dataTableOutput('mytable')
)

shiny::shinyApp(ui=ui,server=server)
Run Code Online (Sandbox Code Playgroud)

我们基本上为我们的表创建一个代理,并且只替换渲染表的数据。有关详细信息,请检查此页面的最底部: https: //rstudio.github.io/DT/shiny.html

我在我的计算机上没有找到提到的示例,但您可以转到 GitHub 并复制并粘贴它: https: //github.com/rstudio/DT/blob/master/inst/examples/DT-reload/app.R

希望这可以帮助。