【问题标题】:R datatable rowCallback with DTR数据表rowCallback与DT
【发布时间】:2015-10-02 06:38:32
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: javascript r datatable shiny dt


    【解决方案1】:

    如果您在浏览器的 JS 控制台中查看第三次尝试的 JS 函数(单击“浏览器中的“检查元素选项”),它会显示一个错误,指出“var”未识别,因为它在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');
           }
         }"
            )
        )
    )
    

    【讨论】:

    • 好的,我现在明白了。谢谢!
    • 如果回答对你有帮助,请采纳,这样对以后的人也有帮助!
    • 您好,如果我想在 if 条件中写 index = (last row index) 而不是 index > 2,那么在不同长度的表的情况下如何写?
    猜你喜欢
    • 2019-12-06
    • 2018-08-25
    • 2018-07-02
    • 2018-05-28
    • 2019-08-02
    • 2017-03-19
    • 2016-08-18
    • 2019-12-19
    • 2019-05-08
    相关资源
    最近更新 更多