【问题标题】:R DT datatable not retaining row index/counter column after selecting new page when using callback option使用回调选项选择新页面后,R DT数据表不保留行索引/计数器列
【发布时间】:2019-08-02 13:17:21
【问题描述】:

我使用this question 作为参考,将“行索引”或“计数器列”(如数据表文档here 中所述)添加到闪亮应用程序中的DT::datatable。目的是将行名称保留在表常量(1、2、3...)中,而不管应用于表的排序如何。

用户 NicE 通过将数据表文档中的 javascript 代码转换为用于DT::datatable 选项的回调来回答了这个问题:

output$tbl = renderDataTable({
                        datatable(data, filter = "top", rownames=TRUE,options = list(
                            pageLength = 300, lengthMenu = c(100,200,300,400,500,600)
                    ),
                    callback=JS("table.on( 'order.dt search.dt', function () {
                            table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
                                  cell.innerHTML = i+1;});}).draw();"))
            })

如果我只在本地运行 datatable(... 部分代码,这可以正常工作;但是,当我在 Shiny 应用程序的 renderDataTable 内运行时,它不起作用(当您移动到第一个以外的页面)。根据上面链接的数据表文档中的评论,用户 DeFKnoL 确定如果您在表中的页面之间移动,这将无法正常工作 - 这是我运行 Shiny 应用程序时的确切问题. DeFKnoL 的评论指出 ("deferRender": true) 会导致此问题 - 我已尝试在 DT::datatable 选项中将其更改为 FALSE,但这并不能解决问题。

我希望有人能帮我把这个用户的 javascript 代码转换成我可以输入到DT::datatable 的回调选项的东西。

以下是数据表文档中概述的原始方法的 javascript 代码(NicE 修改后用于回调):

$(document).ready(function() {
var t = $('#example').DataTable( {
    "columnDefs": [ {
        "searchable": false,
        "orderable": false,
        "targets": 0
    } ],
    "order": [[ 1, 'asc' ]]
} );

t.on( 'order.dt search.dt', function () {
    t.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
        cell.innerHTML = i+1;
    } );
} ).draw();

});

这是解决页面更改问题的 DeFKnoL 的更新方法:

$(document).ready(function() {
var t = $('#example').DataTable( {
    "columnDefs": [ {
        "searchable": false,
        "orderable": false,
        "targets": 0
    } ],
    "order": [[ 1, 'asc' ]]
} );

t.on( 'draw.dt', function () {
var PageInfo = $('#example').DataTable().page.info();
     t.column(0, { page: 'current' }).nodes().each( function (cell, i) {
        cell.innerHTML = i + 1 + PageInfo.start;
    } );
} );

});

如您所见,NicE 的 JS() 输入与文档不完全匹配 - 而且我没有使用 javascript 的经验 - 所以我很难实现这一更改。添加“计数器列”可能比这简单得多,但是除了上面链接的原始问题之外,我没有找到任何方法。任何帮助将不胜感激!

【问题讨论】:

    标签: javascript r shiny datatables dt


    【解决方案1】:

    两种可能:

    1) 使用server = FALSE:

    output$tbl <- renderDT({
      datatable(data, filter = "top", rownames=TRUE, 
                options = list(
                  pageLength = 300, lengthMenu = c(100,200,300,400,500,600)
                ),
                callback=JS("table.on( 'order.dt search.dt', function () {
                  table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
                  cell.innerHTML = i+1;});}).draw();")
      )
    }, server = FALSE)
    

    2) 否则,这里是DeFKnoL的方法:

    js <- c(
      "table.on('draw.dt', function(){",
      "  var PageInfo = table.page.info();",
      "  table.column(0, {page: 'current'}).nodes().each(function(cell,i){", 
      "    cell.innerHTML = i + 1 + PageInfo.start;",
      "  });",
      "})")
    
    output$tbl <- renderDT({
      datatable(data, filter = "top", rownames=TRUE, 
                options = list(
                  pageLength = 300, lengthMenu = c(100,200,300,400,500,600)
                ),
                callback = JS(js)
      )
    })
    

    【讨论】:

    • 第二种方法效果很好。我无法使用第一个选项,因为我正在使用的表可能超过 10,000 行,具体取决于所选的数据(它适用于较小的数据集 - 约 500 行 - 但不适用于较大的数据集)。谢谢!
    • 好的,所以在将其投入生产之后,JavaScript 似乎覆盖了我对数据表拥有的一些 CSS 样式......列名现在在对表格进行排序后恢复为右对齐。我将文本对齐设置为居中 - 这是您最初加载表格时的显示方式 - 但在您对列进行排序后,列名更改为右对齐。你知道为什么会这样吗?
    • @Luke_ew 我不知道对不起。如果你提出一个新问题,我可以看看。
    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2013-07-17
    • 2017-03-23
    相关资源
    最近更新 更多