R-使用DT按行格式化

时间:2018-12-14 18:18:29

标签: javascript r shiny dt

我有一个要在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%相同,但是现在第一个实际列的格式正确,但其余列的格式不正确。

1 个答案:

答案 0 :(得分:0)

执行j=2时,从td:eq(j)开始。这将丢弃第0列(行名的列)和第1列。我还添加了if(index>0)以丢弃第一行(在Javascript中由0索引)。首先,用数字列制作一个数据框。

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) + '%');",
    "    }",
    "  }",
    "}"
  ))
))

enter image description here