如何在数据表的 styleEqual() 中指定 missing 或 NA?
How do you specify missing or NA in datatable's styleEqual()?
我有一个 R 数据table 对象,其中 empty/blank 个单元对应于数据框(相关矩阵)中的 NA。如果单元格包含 1、-1 或空白,我想更改单元格的背景颜色。
这段代码创建了一个 table 并使用 styleEqual() 来标记带有 1 或 -1 的单元格,但我找不到 missing/blank/NA 的适当规范。如何识别 styleEqual() 中的空白单元格?
df <- data.frame(x = c(1, .3, NA),
y = c(.3, 1, -1),
z = c(NA, -1, 1))
dt <- DT::datatable(df)
dt <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = styleEqual(c(-1, 1, NA), c('gray', 'green', 'red')))
dt
结果数据table:
您可以在 styleEqual
上更详细地找到答案。它从JS函数中输出一个带有class "JS_EVAL"的字符串,直接调用styleEqual
即可查看
styleEqual(c(-1, 1, NA), c('gray', 'green', 'red'))
# [1] "value == -1 ? \"gray\" : value == 1 ? \"green\" : value == \"NA\" ? \"red\" : value"
# attr(,"class")
# [1] "JS_EVAL"
从那里你只需要知道 javascript 如何处理 NA 值 (NaN),你可以制作你自己的配色方案,然后你可以通过修改值来制作你自己的字符串
myJScolor = "value == -1 ? \"gray\" : value == 1 ? \"green\" : isNaN(parseFloat(value)) ? \"red\" : value"
class(myJScolor) = "JS_EVAL"
myJScolor
dt2 <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = myJScolor )
dt2
一个更通用的解决方案是创建一个新版本的 styleEqual,如下所示:
df <- data.frame(x = c(1, .3, NA),
y = c(.3, 1, -1),
z = c(NA, -1, 1))
newstyleEqual <- function (levels, values, default = NULL)
{
n = length(levels)
if (n != length(values))
stop("length(levels) must be equal to length(values)")
if (!is.null(default) && (!is.character(default) || length(default) !=
1))
stop("default must be null or a string")
if (n == 0)
return("''")
levels = DT:::jsValues(levels)
values = DT:::jsValues(values)
js = ""
for (i in seq_len(n)) {
if(levels[i]=="\"NA\""){ # needed because jsValues converts NA to a string
js = paste0(js, sprintf("isNaN(parseFloat(value)) ? %s : ",
values[i]))
}else{
js = paste0(js, sprintf("value == %s ? %s : ", levels[i],
values[i]))
}
}
default = if (is.null(default))
"value"
else jsValues(default)
DT::JS(paste0(js, default))
}
dt <- DT::datatable(df)
dt <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = newstyleEqual(c(-1, 1, NA), c('gray', 'green', 'red')))
dt
我有一个 R 数据table 对象,其中 empty/blank 个单元对应于数据框(相关矩阵)中的 NA。如果单元格包含 1、-1 或空白,我想更改单元格的背景颜色。
这段代码创建了一个 table 并使用 styleEqual() 来标记带有 1 或 -1 的单元格,但我找不到 missing/blank/NA 的适当规范。如何识别 styleEqual() 中的空白单元格?
df <- data.frame(x = c(1, .3, NA),
y = c(.3, 1, -1),
z = c(NA, -1, 1))
dt <- DT::datatable(df)
dt <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = styleEqual(c(-1, 1, NA), c('gray', 'green', 'red')))
dt
结果数据table:
您可以在 styleEqual
上更详细地找到答案。它从JS函数中输出一个带有class "JS_EVAL"的字符串,直接调用styleEqual
styleEqual(c(-1, 1, NA), c('gray', 'green', 'red'))
# [1] "value == -1 ? \"gray\" : value == 1 ? \"green\" : value == \"NA\" ? \"red\" : value"
# attr(,"class")
# [1] "JS_EVAL"
从那里你只需要知道 javascript 如何处理 NA 值 (NaN),你可以制作你自己的配色方案,然后你可以通过修改值来制作你自己的字符串
myJScolor = "value == -1 ? \"gray\" : value == 1 ? \"green\" : isNaN(parseFloat(value)) ? \"red\" : value"
class(myJScolor) = "JS_EVAL"
myJScolor
dt2 <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = myJScolor )
dt2
一个更通用的解决方案是创建一个新版本的 styleEqual,如下所示:
df <- data.frame(x = c(1, .3, NA),
y = c(.3, 1, -1),
z = c(NA, -1, 1))
newstyleEqual <- function (levels, values, default = NULL)
{
n = length(levels)
if (n != length(values))
stop("length(levels) must be equal to length(values)")
if (!is.null(default) && (!is.character(default) || length(default) !=
1))
stop("default must be null or a string")
if (n == 0)
return("''")
levels = DT:::jsValues(levels)
values = DT:::jsValues(values)
js = ""
for (i in seq_len(n)) {
if(levels[i]=="\"NA\""){ # needed because jsValues converts NA to a string
js = paste0(js, sprintf("isNaN(parseFloat(value)) ? %s : ",
values[i]))
}else{
js = paste0(js, sprintf("value == %s ? %s : ", levels[i],
values[i]))
}
}
default = if (is.null(default))
"value"
else jsValues(default)
DT::JS(paste0(js, default))
}
dt <- DT::datatable(df)
dt <- DT::formatStyle(dt, c(1:ncol(df)), backgroundColor = newstyleEqual(c(-1, 1, NA), c('gray', 'green', 'red')))
dt