我有一个data.table我用DT显示。在两列中,我显示百分比,并希望显示背景条。但是,列数可能会根据所选表格而改变。将有一个或两个百分比列。
到目前为止,这是一些虚拟数据和我的方法,但是没有成功使用grep。
a <- c(45, 143, 123, 120, 118, 109, 94, 81)
b <- c(54, 132, 119, 113, 108, 104, 99, 91)
a2 <- round(a/sum(a)*100,2)
b2 <- round(b/sum(b)*100,2)
dt <- data.table("Age" = c("-20", "20-30", "30-40", "40-50",
"50-60", "60-70", "70-80", "80+"),
"Group A" = a,
"Group A %" = a2,
"Group B" = b,
"Group B %" = b2)
if(sample(c(0,1), 1)==1) x <- dt else x <- dt[ ,c(1:3)]
DT::datatable(x,
rownames = FALSE,
extensions = c('FixedColumns'),
class = 'cell-border stripe',
options = list(dom = 't',
pageLength = nrow(x),
columnDefs = list(list(className = 'dt-center', targets = 0:(ncol(x)-1)))
)
) %>%
formatStyle(
grep("%", colnames(x), value=TRUE),
background = styleColorBar(x[, .SD, .SDcols=grep("%", colnames(x), value=TRUE)], 'steelblue'),
backgroundSize = '50% 50%',
backgroundRepeat = 'no-repeat',
backgroundPosition = 'right')
不幸的是,这会产生错误:
*Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric variables*
那么如何动态选择列来显示条形图?
任何帮助都非常感激。
答案 0 :(得分:1)
问题来自range()
中的styleColorBar()
,因为它需要数字或字符向量。
如果只传递要应用css的列的值,它将起作用。您可以使用styleColorBar = unlist(x[, .SD, .SDcols=grep("%", colnames(x), value=TRUE)])
来执行此操作:
DT::datatable(x,
rownames = FALSE,
extensions = c('FixedColumns'),
class = 'cell-border stripe',
options = list(dom = 't',
pageLength = nrow(x),
columnDefs = list(list(className = 'dt-center', targets = 0:(ncol(x)-1)))
)
) %>%
formatStyle(
columns = grep("%", colnames(x), value=TRUE),
background = styleColorBar(unlist(x[, .SD, .SDcols=grep("%", colnames(x), value=TRUE)]), 'steelblue'),
backgroundSize = '50% 50%',
backgroundRepeat = 'no-repeat',
backgroundPosition = 'right')
这将返回