最近用 DT 包中的 styleColorBar 函数时遇到一个问题,那是就用它给某列填充条形后,该列数据数值最小的那个单元格是没有填充任何东西的,见图一。为了使这列数据每个单元格都填充上条形图,我给整份数据多加了一行 0,见图二。不造是不是我用这函数没用对呢?

图一

图二

图一的代码

library(DT)
data <- data.frame(
  value1 = c(24053, 4696, 7558),
  value2 = c(10000, 10000, 10000),
  value3 = c(12697, 12160, 2365))

datatable(data,
          rownames = FALSE,
          options = list(dom = 't',
                         pageLength = 3)) |> formatStyle(
                           columns = 'value1',
                           background = styleColorBar(data$value1, '#58A449FF'),
                           backgroundSize = '100% 80%',
                           backgroundRepeat = 'no-repeat',
                           backgroundPosition = 'center',
                           textAlign = 'center') 

图二的代码

library(DT)
data <- data.frame(
  value1 = c(24053, 4696, 7558),
  value2 = c(10000, 10000, 10000),
  value3 = c(12697, 12160, 2365))
tmp <- data.frame(value1 = 0,
                  value2 = 0,
                  value3 = 0)

data <- rbind(data, tmp)

datatable(data,
          rownames = FALSE,
          options = list(dom = 't',
                         pageLength = 3)) |> formatStyle(
                           columns = 'value1',
                           background = styleColorBar(data$value1, '#58A449FF'),
                           backgroundSize = '100% 80%',
                           backgroundRepeat = 'no-repeat',
                           backgroundPosition = 'center',
                           textAlign = 'center') 

本楼主猜,可能这个函数本来的用意就是这样,于是看了看函数的具体脚本,然而由于 R 语言基础太差,没看懂。

> styleColorBar
function (data, color, angle = 90) 
{
    rg = range(data, na.rm = TRUE, finite = TRUE)
    r1 = rg[1]
    r2 = rg[2]
    r = r2 - r1
    JS(sprintf("isNaN(parseFloat(value)) || value <= %f ? '' : 'linear-gradient(%fdeg, transparent ' + Math.max(%f - value, 0)/%f * 100 + '%%, %s ' + Math.max(%f - value, 0)/%f * 100 + '%%)'", 
        r1, angle, r2, r, color, r2, r))
}
<bytecode: 0x00000258afa86b08>
<environment: namespace:DT>

    搭便车再问一个问题,给数据框添加一行数据有没撒简便操作?我觉得我这样写略有点麻烦。

    data <- data.frame(
      value1 = c(24053, 4696, 7558),
      value2 = c(10000, 10000, 10000),
      value3 = c(12697, 12160, 2365))
    tmp <- data.frame(value1 = 0,
                      value2 = 0,
                      value3 = 0)
    
    data <- rbind(data, tmp)

      yuanfan
      如下:

      datatable(data,
                rownames = FALSE,
                options = list(dom = 't',
                               pageLength = 3)) |> formatStyle(
                                 columns = 'value1',
                                 background = styleColorBar(c(data$value1, 0), '#58A449FF'),
                                 backgroundSize = '100% 80%',
                                 backgroundRepeat = 'no-repeat',
                                 backgroundPosition = 'center',
                                 textAlign = 'center') 

      思路:
      styleColorBar(data$value1, '#58A449FF') 直接加个 0 改成 styleColorBar(c(data$value1, 0), '#58A449FF') 就行了。