FormatStyle across multiple DT R columns

I have data.frame with one ID column and multiple numeric columns, the number of numeric columns may vary. Of these numeric columns, I want to color all values ​​above the average value of the column, and all values ​​below the column indicate red. The code below gives my desired result, but this is not general code for data frames with more or less numeric columns.

library(DT) data2 <- cbind(ID = "some ID",iris[,1:4]) datatable( data2, rownames = FALSE, class = 'cell-border stripe', options = list( dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) ) ) %>% formatStyle(colnames(data)[2], backgroundColor = styleInterval(mean(data[,2]), c("red","green"))) %>% formatStyle(colnames(data)[3], backgroundColor = styleInterval(mean(data[,3]), c("red","green"))) %>% formatStyle(colnames(data)[4], backgroundColor = styleInterval(mean(data[,4]), c("red","green"))) %>% formatStyle(colnames(data)[5], backgroundColor = styleInterval(mean(data[,5]), c("red","green"))) 

I would like to replace the code above with the code below, but this will not work. The code below will also work when the number of numeric columns changes.

 datatable( data2, rownames = FALSE, class = 'cell-border stripe', options = list( dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) ) ) %>% formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleInterval(colMeans(data2[,2:ncol(data2)]), c("red","green"))) 

Is it possible? So yes, how?

+6
source share
2 answers

You can do this by adding a calculation, for example

(Does not work with the same value in different columns)

 hepl_1=sapply(2:ncol(data2),function(i) ifelse(data2[[i]]>=mean(data2[[i]]),"rgb(255,0,0)","rgb(0,255,0)")) help_3=as.matrix(data2[2:ncol(data2)]) datatable( data2, rownames = FALSE, class = 'cell-border stripe', options = list( dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) ) ) %>% formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleEqual(help_3, hepl_1)) 

Update

You can create rowCallback as

 datatable( data2, rownames = FALSE, class = 'cell-border stripe', options = list( dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')), rowCallback=JS(paste0("function(row, data) {\n", paste(sapply(2:ncol(data2),function(i) paste0("var value=data[",i-1,"]; if (value!==null) $(this.api().cell(row,",i-1,").node()).css({'background-color':value <=", mean(data2[[i]])," ? 'red' : 'green'});\n") ),collapse = "\n"),"}" )) ) ) 
+3
source

The styleEqual option using a matrix with numbers and a matrix with colors does not work for me, even if the values ​​are unique. Does anyone else face the same issue?

0
source

All Articles