如何在dataTable中保存排序?

时间:2015-01-15 14:35:32

标签: r datatables shiny

我在页面上有可能在列中进行排序的表格,在我重新加载带有反应表的数据后,再次排序,这里是server.R代码:

    library(shiny)

shinyServer(function(input, output) {

  # Return the requested dataset
  datasetInput <- reactive({
    switch(input$dataset2,
           "[,...]" = diamonds,
           "[10:30,...]" = diamonds,
           "[31:50,...]" = diamonds)
  })

  #"[,...]" = diamonds[,],
  #"[10:30,...]" = diamonds[10:30,],
  #"[31:50,...]" = diamonds[31:50,])

  # Show the first "n" observations
  output$view <- renderTable({
    head(datasetInput())
  })

  # a large table, reative to input$show_vars
  output$mytable1 <- renderDataTable({
    library(ggplot2)
    datasetInput()[, input$show_vars, drop = FALSE]
  })

})

1 个答案:

答案 0 :(得分:0)

保留排序顺序(和选择)的最佳方法是使用proxyDataTable和replaceData来更新数据,而不是每次更新数据时都创建新表:

Employee  ReportsTo   Depth   TreePath
a         NULL        0       a
b         a           1       a -> b
c         a           2       a -> b -> c
d         a           3       a -> b -> c -> d
c         b           1       b -> c
d         b           2       b -> c -> d
d         c           1       c -> d

但有几点需要注意。如果您正在使用模块,请查看此主题以确保您将正确的会话变量传递给代理:https://github.com/rstudio/DT/issues/359

另外,如果对数据表使用rownames = false,则还必须将参数传递给replaceData。

如果proxyDataTable不是一个选项,你也可以在DT :: renderDataTable中使用回调:

mydata = reactive({
    df$ID <<- c(df$ID[n], df$ID[-n])
    df
  })
  output$foo = DT::renderDataTable(isolate(mydata()))
  proxy = dataTableProxy('foo')

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

my.js中的javascript函数(存储在www目录中):

#include some javascript
tags$head(tags$script(src="my.js"))

#options to renderDataTable
 preDrawCallback = JS("initTableOrder"),
 drawCallback = JS("saveTableOrder")