javascript - 带 DT 的 R 数据表 rowCallback

标签 javascript r datatable shiny dt

我正在尝试使用 DT 和 magrittr 包对数据表对象执行两种不同的格式化操作。一个使用辅助函数 formatRound(),另一个作为 JavaScript 传递给数据表函数中的 rowCallback 选项。

当我单独运行任一格式化操作时,数据表以预期的格式呈现。但是,当我同时运行两者时,数据表呈现空白,但我没有收到错误。

这段代码展示了我所描述的行为。

library(magrittr)
library(DT)

df = data.frame(matrix(rnorm(20), nrow=10))

datatable(
  data = df
) %>%
  formatRound(c("X1", "X2"), 1)

#table renders as expected

datatable(
  data = df,
  options = list(
    rowCallback = JS("
     function( row, data, index ) {
       if ( index > 2 ) {
        $(row).css('background-color', '#EDEDED');
       }
       else if ( index > 0 ) {
        $(row).css('background-color', '#DEDEDE');
       }
       else {
        $(row).css('background-color', '#D3D3D3');
       }
     }"
    )
  )
)

#table renders as expected

datatable(
  data = df,
  options = list(
    rowCallback = JS("
     function( row, data, index ) {
      if ( index > 2 ) {
        $(row).css('background-color', '#EDEDED');
      }
      else if ( index > 0 ) {
        $(row).css('background-color', '#DEDEDE');
      }
      else {
        $(row).css('background-color', '#D3D3D3');
      }
     }"
    )
  )
) %>%
  formatRound(c("X1", "X2"), 1)

#table renders as blank but with no error returned

最佳答案

如果你在浏览器的 JS 控制台中查看你第三次尝试的 JS 函数(点击“浏览器中的检查元素选项”),它会显示一个错误,说 'var' is unidentified because it is outside the JS函数的范围:

(
var d = parseFloat(data[1]); $(this.api().cell(row, 1).node()).html(isNaN(d) ? '' : d.toFixed(1));
var d = parseFloat(data[2]); $(this.api().cell(row, 2).node()).html(isNaN(d) ? '' : d.toFixed(1));
     function( row, data, index ) {
      if ( index > 2 ) {
        $(row).css('background-color', '#EDEDED');
      }
      else if ( index > 0 ) {
        $(row).css('background-color', '#DEDEDE');
      }
      else {
        $(row).css('background-color', '#D3D3D3');
      }
     })

如果将这两行代码放在 JS 函数中,它会完美运行。

您可以在下面找到更新后的代码。

datatable(
    data = df,
    options = list(
        rowCallback = JS("
     function( row, data, index ) {
        var d = parseFloat(data[1]); 
        $(this.api().cell(row, 1).node()).html(isNaN(d) ? '' : d.toFixed(1));
        var d = parseFloat(data[2]); 
        $(this.api().cell(row, 2).node()).html(isNaN(d) ? '' : d.toFixed(1));
       if ( index > 2 ) {
        $(row).css('background-color', '#EDEDED');
       }
       else if ( index > 0 ) {
        $(row).css('background-color', '#DEDEDE');
       }
       else {
        $(row).css('background-color', '#D3D3D3');
       }
     }"
        )
    )
)

关于javascript - 带 DT 的 R 数据表 rowCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392844/

相关文章:

javascript - Angular2/Electron 应用程序组件找不到模板 HTML 文件

r - 按年将数据汇总为月度计数

javascript - 如何获取不知道名称的变量的内容

javascript - 数据表 - 响应不起作用?

javascript - 游戏继续进行 - 希望在玩家获胜时停止

javascript - 根据 axios GET 请求的响应填充 Vue 数据

r - Dplyr 变异用 NA 划分两列

r - 如何获得两个矩阵的交集?

c# - 如何从xsd文件中获取数据表名称

javascript - 从外部样式化嵌套样式组件