在R中使用库DT呈现数据表时,如何使用行条件为单元格着色?
我正在使用DT库在一个闪亮的应用程序中呈现一个2 x 5的数据表(所有数字行) 我想通过比较每个单元格与其对应行的平均值来给单元格着色 我无法使用库中提供的当前函数执行此操作。通过谷歌搜索,我发现我必须使用JavaScript来实现这一点 我没有用JavaScript编码的经验,需要一个这样做的例子 要求:将单元格与对应的行平均值进行比较,如果值小于平均值,则将单元格上色,否则为绿色。作为一个可复制的示例,请参考以下代码块:在R中使用库DT呈现数据表时,如何使用行条件为单元格着色?,r,shiny,dt,R,Shiny,Dt,我正在使用DT库在一个闪亮的应用程序中呈现一个2 x 5的数据表(所有数字行) 我想通过比较每个单元格与其对应行的平均值来给单元格着色 我无法使用库中提供的当前函数执行此操作。通过谷歌搜索,我发现我必须使用JavaScript来实现这一点 我没有用JavaScript编码的经验,需要一个这样做的例子 要求:将单元格与对应的行平均值进行比较,如果值小于平均值,则将单元格上色,否则为绿色。作为一个可复制的示例,请参考以下代码块: set.seed(1) x <- sample(1:10, si
set.seed(1)
x <- sample(1:10, size = 5, replace = T)
set.seed(1)
y <- sample(100:200, size = 5, replace = T)
## Main data frame, to be used in DT::datatable function
df <- data.frame(rbind(x, y))
df
## X1 X2 X3 X4 X5
## x 3 4 6 10 3
## y 126 137 157 191 120
x_mean <- mean(x)
y_mean <- mean(y)
## Rendering data table
DT::datatable(
df,
options = list(
searching = F,
paging = F,
ordering = F,
info = F
)
) %>%
DT::formatStyle(1:5, backgroundColor = styleInterval(x_mean, c("red",
"green")))
set.seed(1)
x解决方案可以是创建一个循环,将每个值与行平均值进行比较,然后使用pass
命令为单元格着色。
您可以在此处找到一个示例:
在本例中,使用以下命令为单元格着色(使用latex):\\cellcolor{red!25}
。根据您想要的提取类型进行更改
没有任何可复制的例子,回答起来很复杂。我仍然希望它能有所帮助
编辑
一种简单快捷的方法是从一开始就选择所需的行(df[1,]
):
我们可以让它更“自动化”,用1:length(df[1,])
替换1:5
,用x\u-mean
替换mean(as.numeric(df[1,])
:
解决方案可以是创建一个循环,将每个值与行平均值进行比较,然后使用pass
命令为单元格着色。
您可以在此处找到一个示例:
在本例中,使用以下命令为单元格着色(使用latex):\\cellcolor{red!25}
。根据您想要的提取类型进行更改
没有任何可复制的例子,回答起来很复杂。我仍然希望它能有所帮助
编辑
一种简单快捷的方法是从一开始就选择所需的行(df[1,]
):
我们可以让它更“自动化”,用1:length(df[1,])
替换1:5
,用x\u-mean
替换mean(as.numeric(df[1,])
:
库(DT)
种子(1)
x库(DT)
种子(1)
没有医生是很难帮忙的。你看过这些文件了吗?已经有很多基于数值的样式行。感谢您的快速回复。我已经更新了我的帖子并添加了一个图片。希望有帮助!我可以帮助你,但前提是你提供一个最低限度的工作示例。查看camille共享的链接并编辑您的帖子。请原谅我的天真,这是我第一次在Stack Overflow上发帖。我编辑了这篇文章,包括一个可复制的例子以及实际和预期的输出。希望这有帮助!为什么x
和y
是行而不是列?您的需求在这种结构下更容易实现。一般来说,将变量作为列总是比较好的。如果没有列,很难提供帮助。你看过这些文件了吗?已经有很多基于数值的样式行。感谢您的快速回复。我已经更新了我的帖子并添加了一个图片。希望有帮助!我可以帮助你,但前提是你提供一个最低限度的工作示例。查看camille共享的链接并编辑您的帖子。请原谅我的天真,这是我第一次在Stack Overflow上发帖。我编辑了这篇文章,包括一个可复制的例子以及实际和预期的输出。希望这有帮助!为什么x
和y
是行而不是列?您的需求在这种结构下更容易实现。通常,最好将变量作为columns.Hi。谢谢你的回复!我不确定如何将其集成到datatable函数中。我编辑了这篇文章,加入了一个可复制的例子。希望这能提供澄清。这会有所帮助。但是如何将第二行添加到此数据表?嗨。谢谢你的回复!我不确定如何将其集成到datatable函数中。我编辑了这篇文章,加入了一个可复制的例子。希望这能提供澄清。这会有所帮助。但是如何将第二行添加到此数据表中?
datatable(df[1,]) %>% formatStyle(1:5,
backgroundColor = styleInterval(x_mean, c("red","green")))
datatable(df[1,]) %>% formatStyle(1:length(df[1,]),
backgroundColor = styleInterval(mean(as.numeric(df[1,])), c("red","green")))
library(DT)
set.seed(1)
x <- sample(1:10, size = 5, replace = T)
set.seed(1)
y <- sample(100:200, size = 5, replace = T)
df <- data.frame(rbind(x, y))
rowCallback <- c(
"function(row, dat, displayNum, index){",
" var N = dat.length;",
" if(index == 0){ // only first row",
" var rowData = dat.slice(); rowData.shift();",
" var mean = rowData.reduce(function(a, b){ return a + b }, 0) / (N-1);",
" for(var j=1; j<N; j++){",
" var color = dat[j] < mean ? 'red' : 'green';",
" $('td:eq('+j+')', row).css('background-color', color);",
" }",
" }",
"}"
)
datatable(
df,
options = list(
searching = F,
paging = F,
ordering = F,
info = F,
rowCallback = JS(rowCallback)
)
)