如何在闪亮的数据表中保存排序?

Posted

技术标签:

【中文标题】如何在闪亮的数据表中保存排序?【英文标题】:How to save sorting in dataTable in shiny? 【发布时间】:2015-03-13 23:39:02 【问题描述】:

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

)

【问题讨论】:

抱歉,但我认为没有办法在 DataTables 中保留已排序的列以便闪亮。 我还没有找到好的解决方案,唯一找到的解决方案是使用js回调并在这里编写原生js代码。我不明白为什么这个功能没有在闪亮中实现,看起来很重要。 我还没有尝试过,所以我不能肯定地说,但看起来trestletech / Jeff Allen的shinyStore可能适用于这种情况。 您能否提供一个可重现的示例(带有 ui 和示例数据)? 【参考方案1】:

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

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,则还必须将参数传递给 replaceData。

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

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

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

my.js 中的 javascript 函数(存储在您的 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;
  

【讨论】:

这很好用,但是,它以某种方式推翻了另一列的排序。如果我按一列排序,单击另一列标题会触发“处理”,然后似乎中止。

以上是关于如何在闪亮的数据表中保存排序?的主要内容,如果未能解决你的问题,请参考以下文章

R闪亮的动态DT数据表记住过滤器/排序

从闪亮的渲染数据表中保存

如何保存在闪亮的应用程序中制作的图

闪亮:更改输入后保持选中数据表上的框

如何以闪亮的方式遍历多个上传小部件?

闪亮 - 在数据表中选择记录时如何突出显示传单地图上的对象?