最近用 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>