使用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';
}
}
}")))