【问题标题】:R - Formatting by row using DTR - 使用 DT 按行格式化
【发布时间】:2019-05-16 00:47:58
【问题描述】:

我有一个数据表,我想在 Shiny 应用程序中按行显示不同的数字格式。我发现用户 Nice 以前的解决方案在所有列和行都是数字时有效,见此处: R Shiny DataTables: Format numbers not by column but by row

不幸的是,我的第一列是非数字的,对于我的表格,上述解决方案在第一列中给出了 NaN% 值,并且不格式化后面的列。我确信有办法解决这个问题,但我不懂 JavaScript,所以我不知道如何正确修改 rowCallback 函数。

这是我目前的尝试:

library(DT)
dat <- as.data.frame(matrix(c("# respondents",20,35,18,"involvement rate",.85,.8285,.8889,"target",.80,.85,.9),nrow=3,byrow=T))

datatable(dat,options=list(
  rowCallback=JS("function( row, dat, index ) {
                 $('td:eq(0)', row).html(dat[0] % 1 != 0 | dat[0]==0 ? (dat[0]*100).toFixed(1) +'%':dat[0]);
                 $('td:eq(1)', row).html(dat[1] % 1 != 0 | dat[1]==0 ? (dat[1]*100).toFixed(1) +'%':dat[1]);
                 }
                 ")))

感谢任何帮助!

编辑:我认为由于唯一预期的字符串将在第一列中,因此我可以将该列更改为行名:

dat2 <- subset(dat, select = -1)
rname <- as.vector(dat$V1)
row.names(dat2) <- rname

然后在 dat2 而不是 dat 上运行 datatable(...)。这会导致行名的 NaN% 相同,但现在第一个实际列的格式正确,但其余列的格式不正确。

【问题讨论】:

    标签: javascript r shiny dt


    【解决方案1】:

    j=2 开始,当您使用td:eq(j) 时。这将丢弃0-th 列(行名列)和1-th 列。我还添加了if(index&gt;0) 以丢弃第一行(在Javascript 中由0 索引)。 Prealably,制作一个带有数字列的数据框。

    library(DT)
    dat <- data.frame(
      V1 = c("# respondents", "involvement rate", "target"),
      V2 = c(20, 0.85, 0.8),
      V3 = c(35, 0.8285, 0.85),
      V4 = c(18, 0.8889, 0.9)
    )
    
    datatable(dat,options=list(
      rowCallback=JS(c(
        "function(row, dat, index) {",
        "  if(index > 0){",
        "    for(var j=2; j<dat.length; j++){",
        "      $('td:eq('+j+')', row).",
        "        html((dat[j]*100).toFixed(1) + '%');",
        "    }",
        "  }",
        "}"
      ))
    ))
    

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 2019-04-12
      • 2018-04-13
      • 1970-01-01
      • 2018-08-25
      • 2021-12-13
      • 1970-01-01
      • 2019-10-23
      • 2020-10-28
      相关资源
      最近更新 更多