在R中使用库DT呈现数据表时,如何使用行条件为单元格着色?

在R中使用库DT呈现数据表时,如何使用行条件为单元格着色?,r,shiny,dt,R,Shiny,Dt,我正在使用DT库在一个闪亮的应用程序中呈现一个2 x 5的数据表(所有数字行) 我想通过比较每个单元格与其对应行的平均值来给单元格着色 我无法使用库中提供的当前函数执行此操作。通过谷歌搜索,我发现我必须使用JavaScript来实现这一点 我没有用JavaScript编码的经验,需要一个这样做的例子 要求:将单元格与对应的行平均值进行比较,如果值小于平均值,则将单元格上色,否则为绿色。作为一个可复制的示例,请参考以下代码块: set.seed(1) x <- sample(1:10, si

我正在使用DT库在一个闪亮的应用程序中呈现一个2 x 5的数据表(所有数字行)

我想通过比较每个单元格与其对应行的平均值来给单元格着色

我无法使用库中提供的当前函数执行此操作。通过谷歌搜索,我发现我必须使用JavaScript来实现这一点

我没有用JavaScript编码的经验,需要一个这样做的例子

要求:将单元格与对应的行平均值进行比较,如果值小于平均值,则将单元格上色,否则为绿色。作为一个可复制的示例,请参考以下代码块:

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)
  )
)