【问题标题】:How to customize datatable by row with custom threshold如何使用自定义阈值按行自定义数据表
【发布时间】:2020-01-12 04:04:37
【问题描述】:

这与另一个问题link有关。

目前我正在使用此代码为我的表格应用一些样式。

只有当值超过row 的第三个分位数时,我才需要为每个单元格着色,问题是DT 似乎不允许row 工作,只能通过column

formattable() 工作正常,但我失去了DT 的一些有用的属性,例如使用editable=T 编辑单元格的可能性。

library(formattable)
library(DT)

dat <- as.data.frame(matrix(AirPassengers, ncol=12, byrow=T))

find_anomaly <- function(x) {
  q3 <- quantile(x, 0.75)
  q3
}

ftable <- formattable(dat, lapply(1:nrow(dat), function(row) {
  area(row, col = 1:12) ~ formatter("span", style = x ~ ifelse(x > find_anomaly(x),
                                                               style(
                                                                 display = "block",
                                                                 padding = "0 4px",
                                                                 "border-radius" = "4px",
                                                                 "color" = csscolor("white"),
                                                                 "background-color" = csscolor(
                                                                   gradient(as.numeric(x),"white", "orangered"))),
                                                               NA))
}))

as.datatable(ftable, editable=T)

在这里你可以看到一切都很好,除了表格显示来自formattable() 的 HTML 一次点击:

有没有办法让formattable 生成的样式与editable=T 一起工作正常?

【问题讨论】:

    标签: r dt formattable


    【解决方案1】:

    这是一个带有DT 的解决方案,将render 选项应用于每一列:

    library(DT)
    
    products <- data.frame(
      X1 = round(runif(5),2),
      X2 = round(runif(5),2),
      X3 = round(runif(5),2),
      X4 = round(runif(5),2),
      X5 = round(runif(5),2),
      X6 = round(runif(5),2),
      X7 = round(runif(5),2),
      X8 = round(runif(5),2),
      X9 = round(runif(5),2),
      X10 = round(runif(5),2)
    )
    
    render <- c(
      "function(data, type, row){",
      "  if(type === 'display'){",
      "    var arr = row.slice();",
      "    arr.sort();",
      "    var per75 =  Math.floor(row.length*.75) - 1;",
      "    var s = data >= arr[per75] ? '<span style=\"padding: 0 4px; border-radius: 4px; background-color: red;\">' + data + '</span>' : data;",
      "    return s;",
      "  } else {",
      "    return data;",
      "  }",
      "}"
    )
    
    datatable(products, editable = "cell", rownames = FALSE, 
              options = list(
                columnDefs = list(
                  list(targets = "_all", render = JS(render))
                )
              )
    )
    

    【讨论】:

    • 谢谢!这个真不错,有小问题麻烦您吗?查看我的更新,我似乎无法使其与 JS 代码一起使用..抱歉,如果它是 OT。基本上我的阈值应该由四分位距加上第三分位数给出。
    • @RLave 我在您的代码中看不到任何错误。也许原因是您没有高于阈值的数据?海耶,您尝试过使用 formattable 并且有效吗?
    • 我在Math.floor(row.length*.75) - 1 删除了“-1”,它的工作方式与预期一样。
    • 请问是否可以将render 应用于除前2 列之外的所有列?也许通过更改 targets = "_all" 参数?目前我正在使用targets = c(1:12),但我不确定它是否正确。
    • @RLave 你可以做targets = c(3,4,5,6,7,8,9,10),或targets = setdiff(1:10, c(1,2))。**编辑**不抱歉,第一列由0索引。而是setdiff(0:9, c(0,1))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2021-10-29
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多