使用R中的DT基于另一列设置一列的样式

使用R中的DT基于另一列设置一列的样式,r,dt,R,Dt,下面的代码使用变量test1\u score和test2\u score创建一个数据帧。如果test2\u分数大于test1\u分数,我需要更改test2\u分数的背景 下面是创建数据帧的代码: df <- data.frame( id = 1:10, name = c("Bob", "Ashley", "James", "David", "Jenny", "Hans", "Leo", "John", "Emily", "Lee"), age = c(

下面的代码使用变量
test1\u score
test2\u score
创建一个数据帧。如果
test2\u分数大于
test1\u分数
,我需要更改
test2\u分数的背景

下面是创建数据帧的代码:

df <- data.frame(
  id = 1:10,
  name = c("Bob", "Ashley", "James", "David", "Jenny", 
           "Hans", "Leo", "John", "Emily", "Lee"), 
  age = c(28, 27, 30, 28, 29, 29, 27, 27, 31, 30),
  grade = c("C", "A", "A", "C", "B", "B", "B", "A", "C", "C"),
  test1_score = c(8.9, 9.5, 9.6, 8.9, 9.1, 9.3, 9.3, 9.9, 8.5, 8.6),
  test2_score = c(9.1, 9.1, 9.2, 9.1, 8.9, 8.5, 9.2, 9.3, 9.1, 8.8),
  final_score = c(9, 9.3, 9.4, 9, 9, 8.9, 9.25, 9.6, 8.8, 8.7),
  registered = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
  stringsAsFactors = FALSE)
你可以做:

library(DT)
df <- data.frame(
  id = 1:10,
  name = c("Bob", "Ashley", "James", "David", "Jenny", 
           "Hans", "Leo", "John", "Emily", "Lee"), 
  age = c(28, 27, 30, 28, 29, 29, 27, 27, 31, 30),
  grade = c("C", "A", "A", "C", "B", "B", "B", "A", "C", "C"),
  test1_score = c(8.9, 9.5, 9.6, 8.9, 9.1, 9.3, 9.3, 9.9, 8.5, 8.6),
  test2_score = c(9.1, 9.1, 9.2, 9.1, 8.9, 8.5, 9.2, 9.3, 9.1, 8.8),
  final_score = c(9, 9.3, 9.4, 9, 9, 8.9, 9.25, 9.6, 8.8, 8.7),
  registered = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
  stringsAsFactors = FALSE)
colors <- with(df, ifelse(test1_score > test2_score, "pink", "blue"))
rgbcolors <- apply(grDevices::col2rgb(colors), 2, 
                   function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=",")))
columns <- c(5,6) # columns test1_score and test2_score
jscode <- 
  paste("function(row, data, index) {",  
        sprintf("var colors=%s;\n%s", 
                sprintf("[%s]", 
                        paste(sprintf("'%s'", rgbcolors), collapse=", ")), 
                paste(sprintf("$(this.api().cell(index, %s).node()).css('background-color', colors[index]);", 
                              columns), collapse="\n")), 
        "}", sep="\n")

datatable(df, escape=FALSE, 
          options = list(rowCallback=JS(jscode))) 
库(DT)

df这里有一个您可以使用的解决方法

#Define a new column for testing
df$Result <- factor(ifelse(df$test2_score > df$test1_score,'More','Not More'),
                    levels=c('More','Not More'))

datatable(df,options = list(columnDefs = list(list(visible=FALSE, targets=c(9))))) %>% #Hide Result using visible=F
   formatStyle('test2_score', valueColumns = 'Result', target = c('cell'),
                backgroundColor = styleEqual(unique(df$Result),  c('gray', 'yellow')))
#定义用于测试的新列
df$Result df$test1_分数,'More','Not More'),
级别=c('More','notmore'))
datatable(df,options=list(columnDefs=list)(list(visible=FALSE,targets=c(9 '))%%>%#使用visible=F隐藏结果
formatStyle('test2_score',valueColumns='Result',target=c('cell'),
backgroundColor=styleEqual(唯一(df$Result),c('gray','yellow'))

这里有一个比我给出的另一个更干净的解决方案(这是很难理解的)

datatable(df,
选项=列表(initComplete=JS(
“功能(设置){
var table=settings.oInstance.api();
对于(var i=0;i cell2.data()){
cell1.node().style.backgroundColor='pink';
}否则{
cell1.node().style.backgroundColor='blue';
}
}
}")))
#Define a new column for testing
df$Result <- factor(ifelse(df$test2_score > df$test1_score,'More','Not More'),
                    levels=c('More','Not More'))

datatable(df,options = list(columnDefs = list(list(visible=FALSE, targets=c(9))))) %>% #Hide Result using visible=F
   formatStyle('test2_score', valueColumns = 'Result', target = c('cell'),
                backgroundColor = styleEqual(unique(df$Result),  c('gray', 'yellow')))
datatable(df, 
          options=list(initComplete = JS(
          "function(settings) {
            var table = settings.oInstance.api();
            for(var i=0; i<10; i++){
              var cell1 = table.cell(i,5);
              var cell2 = table.cell(i,6);
              if(cell1.data() > cell2.data()){
                cell1.node().style.backgroundColor='pink';
              }else{
                cell1.node().style.backgroundColor='blue';
              }
            }
          }")))