Раскраска ячеек с возможностью получения данных внешним вектором

#javascript #java #r #datatable #format

Вопрос:

Мне нужно выделить ячейки в соседних столбцах, если они отличаются. Вот автономный код для проблемы, которую я пытаюсь решить (не работает):

 library(DT)
library(tidyverse)
`%!=na%` <- function(e1, e2) (e1 != e2 | (is.na(e1) amp; !is.na(e2)) | (is.na(e2) amp; !is.na(e1))) amp; !(is.na(e1) amp; is.na(e2))

df <- tibble(
  a = c('a',NA,'','d','a'),
  b = c('a','b','c','d','a'),
  c = c(1,1,2,4,5),
  d = c(1,2,3,4,6)
)
rgbcolors =  cbind(apply(grDevices::col2rgb(ifelse(!(df$a %!=na% df$a), "white", "pink")), 2, 
                        function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=","))),
                  apply(grDevices::col2rgb(ifelse(!(df$a %!=na% df$b), "white", "pink")), 2, 
                        function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=","))),
                  apply(grDevices::col2rgb(ifelse(!(df$c %!=na% df$c), "white", "pink")), 2, 
                        function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=","))),
                  apply(grDevices::col2rgb(ifelse(!(df$c %!=na% df$d), "white", "yellow")), 2, 
                        function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=","))))

rgbcolors = t(rgbcolors)
rgbcolorsJ = NULL
for (j in 1:dim(rgbcolors)[1])  
  rgbcolorsJ[j] = sprintf("[%s]", paste(sprintf("'%s'", rgbcolors[j,]), collapse=", "))
rgbcolorsArray = sprintf("[%s]", paste(sprintf("%s", rgbcolorsJ), collapse=", "))

column <- c(2,4)
columnsArray = sprintf("[%s]", paste(sprintf("%s", column), collapse=", "))

jscodeCol <- paste("function(row, data, index) {",
                   sprintf("var colors=%s;
                        var columns=%s;
                        for (i = 0; i < columns.length; i  ) {
                        var j = columns[i];
                        var col = colors[j][index];
                        $(this.api().cell(index, j).node()).css('background-color', col);
}",
                           rgbcolorsArray,
                           columnsArray), "}", sep="n")
                   

datatable(df, escape=FALSE, 
          options = list(rowCallback=JS(jscodeCol))
)

 

введите описание изображения здесь

Следующая модификация кода JS (явная строка # для массива цветов) использует его для раскрашивания без проблем:

 jscodeCol <- paste("function(row, data, index) {",
                   sprintf("var colors=%s;
                        var columns=%s;
                        for (i = 0; i < columns.length; i  ) {
                        var j = columns[i];
                        var col = colors[1][index];
                        $(this.api().cell(index, j).node()).css('background-color', col);
}",
                           rgbcolorsArray,
                           columnsArray), "}", sep="n")

 

введите описание изображения здесь

Ответ №1:

Нашел, что происходит — внутренний массив цветов отсчитывался от 0:

 jscodeCol <- paste("function(row, data, index) {",
                   sprintf("var colors=%s;
                        var columns=%s;
                        for (i = 0; i < columns.length; i  ) {
                        var j = columns[i];
                        var col = colors[j-1][index];
                        $(this.api().cell(index, j).node()).css('background-color', col);
}",
                           rgbcolorsArray,
                           columnsArray), "}", sep="n")
 

введите описание изображения здесь