2

我正在尝试设置一个带有彩色图块的表格,这些图块根据每列的平均值有条件地着色。基本上,如果该值低于平均值,则该图块将为红色,如果高于平均值,则该图块为绿色。我在下面的函数中使用了一个简单的 if else 语句。

我最终将使用“formattable”包和包中的 color_tile 函数。

我试图编写自己的函数来选择颜色,但它只是成功地标记了我的数据框中的第一行。

#library(formattable) # not used in this example
green <- "#71CA97"
red <- "#ff7f7f"

col1 <- c(1.2, 4.2, 5.6, 7.1)
col2 <- c(5.0, 1.3, 10.3, 6.0)
col3 <- c(4.7, 6.3, 1.5, 6.3)
mydata <- data.frame(col1, col2, col3)

colorPicker <- function(x) {
     if(x <= 5) {return("red")}
     else {return("green")}
}

tile.colors <- lapply(c(mydata), colorPicker)

警告消息:在 if (x <= 5) { 中:条件的长度 > 1,并且只使用第一个元素

“tile.colors”返回正确的颜色,但仅限于第一行。

我最终会在格式化函数中调用“tile.colors”,但现在我只是想让颜色选择函数正确。

有没有更有效的方法来完成这项任务?

4

2 回答 2

3

我将此答案改编为另一个与制作此函数相关的问题color_tile,该函数在调用时根据列的平均值使瓷砖着色:

 color_tile_mean <- function (...) {
  formatter("span", style = function(x) {
    style(display = "block",
          padding = "0 4px", 
          `border-radius` = "4px", 
          `background-color` = ifelse(x < mean(x) , "lightpink", "lightgreen"))
  })}

我不知道如何让它接受自定义颜色,所以要更改它们,只需修改ifelse函数中的条件。在你的情况下:

library(formattable)

# Set custom colors
green <- "#71CA97"
red <- "#ff7f7f"

# Make example table
col1 <- c(1.2, 4.2, 5.6, 7.1)
col2 <- c(5.0, 1.3, 10.3, 6.0)
col3 <- c(4.7, 6.3, 1.5, 6.3)
mydata <- data.frame(col1, col2, col3)

# Define color_tile_mean function
 color_tile_mean <- function (...) {
  formatter("span", style = function(x) {
    style(display = "block",
          padding = "0 4px", 
          `border-radius` = "4px", 
          `background-color` = ifelse(x < mean(x) , red, green)) # Remember to change the colors!
  })}

# Use it just like color_tile but without colors
formattable(mydata, align=c("c", "c", "c"),list(
  col1=color_tile_mean(),
  col2=color_tile_mean(),
  col3=color_tile_mean()
  )
)

结果

我希望这很有用!

于 2020-03-11T09:37:47.997 回答
1

你知道包DT吗?

它允许格式化表格,formatStyle()并且styleInterval()您可以使用类似的功能来根据间隔或平均值对值进行着色。

library(DT)
library(dplyr)

datatable(mydata) %>% 
  formatStyle(columns = colnames(mydata), color = styleInterval(c(5), c(green, red)))

在此处输入图像描述

datatable(mydata) %>% 
  formatStyle(columns = colnames(mydata), backgroundColor = styleInterval(c(5), c(green, red)))

在此处输入图像描述

于 2019-06-26T16:40:33.563 回答