如何在Shiny R应用程序中设置DataTables行回调?

时间:2013-12-29 11:33:44

标签: javascript r datatables shiny

在rCharts中,可以使用特殊的字符串表示法设置DataTables的JS回调:#! function(par) {...} !#。例如,让我们看看以下R代码:

  #JS callback to truncate long strings in table cells and add a tooltip
  callback = "#! 
  function (nRow) {
        $('td', nRow).each(function (index) {
            var maxChars = 80;
                var unfilteredText = $(this).text();
                if (unfilteredText.length > maxChars && maxChars > 3) {
                    $(this).attr('title', unfilteredText);
                    $(this).html(unfilteredText.substring(0, maxChars-4) + '...');
                }
        });
        return nRow;
    } !#"

  result <- dTable(df, aaSorting = list(c(5, "desc")), sPaginationType="full_numbers",
               fnRowCallback=callback)

这是否可以在Shiny DataTables中使用?

1 个答案:

答案 0 :(得分:1)

我偶然发现了这个问题,并且可以使用此处的信息,以及this post第4.5节的帮助来解决此问题。为了实现这一点,您只需执行以下操作:

library(DT)
long_strings = replicate(10, paste(sample(c(0:9, letters, LETTERS), 135, replace = TRUE), collapse = ""))
dat <- data.frame(x = 1:10, 
                  y = month.abb[1:10], 
                  z = long_strings, 
                  stringsAsFactors = FALSE)
DT::datatable(dat,
              options = list(
                rowCallback = JS("function(row, data) {",
                                 "  var max_chars = 80, full_text = data[3];",
                                 "    if (full_text.length > max_chars) {",
                                 "      $('td:eq(3)', row).attr('title', full_text);",
                                 "      $('td:eq(3)', row).html(full_text.substring(0, max_chars - 4) + '...');",
                                 "    }",
                                 "}")))

重要的是要注意,由于我们希望每行操作,因此我们使用rowCallback参数中的options函数 。这与可以在整个表上使用的callback函数形成对比,整个表是DT::datatable的自己的参数。

另请注意,您无需在.text()上致电.innerHTMLdata[3]或任何此类事件。返回的值是该单元格的文本值。

希望将来有人能够遇到这种情况并发现它有益。