r语言 - 如何在数据表中保存排序



我在页面上有表,可以在列中排序,在我用反应表重新加载数据后不再排序,这里是服务器。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]
  })
})

保留排序顺序(和选择)的最佳方法是使用代理数据表和替换数据来更新数据,而不是在每次更新数据时都创建一个新表:

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)
  })

不过,有几件事需要注意。如果您使用的是模块,请检查此线程以确保将正确的会话变量传递给代理:https://github.com/rstudio/DT/issues/359

此外,如果对数据表使用 rownames=false,则还必须传递参数以替换数据。

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

#include some javascript
tags$head(tags$script(src="my.js"))
#options to renderDataTable
 preDrawCallback = JS("initTableOrder"),
 drawCallback = JS("saveTableOrder")

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

var tableSortOrderSave;
function initTableOrder(settings, json) {   
  if(tableSortOrderSave === undefined){
    $(this.api().table().order());
  }else{
    $(this.api().table().order(tableSortOrderSave));
  }
}
function saveTableOrder(settings, json) {
  order  = $(this.api().table().order());
  if(order.length > 0){
    tableSortOrderSave = order;
  }
}

最新更新