How to customize datatable by row with custom threshold

一个人想着一个人 提交于 2019-12-12 16:51:30

问题


This is related to this other question link.

Currently I'm using this code in order to apply some styling to my table.

I need to color each cell only if the value exceeds the 3rd quantile of the row, the problem is that DT doesn't seem to allow to work by row, just by column.

formattable() works ok, but I lose some useful proprieties from DT, for example the possibility to edit the cell with 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)

Here you can see that all is good except that the table shows the HTML from formattable() once clicked:

Is there a way to keep the styling generated from formattable that works ok with editable=T?


回答1:


Here is a solution with DT, applying the render option to each column:

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))
            )
          )
)



来源:https://stackoverflow.com/questions/57870092/how-to-customize-datatable-by-row-with-custom-threshold

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!