如何过滤(搜索)R DT(DataTable)中的格式化列
How to filter (search) formatted columns in R DT (DataTable)
对 DT::datatable()
中的列应用格式设置时,DataTables 自动列过滤器不起作用。例如:
library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
datatable(df, filter="bottom") %>% formatCurrency(columns = "b", currency = "$")
列 b
的过滤器失败。
我认为这是一个非常普遍的问题,必须有一个解决方案。我一直在寻找,但到目前为止没有成功。如果有人指出我已解决此问题,将不胜感激。
我知道通过使用 DT 网站上的 JS
回调函数(https://rstudio.github.io/DT/options.html 参见 4.5 行渲染和 运行 它与 filter="top"
),可以使用 格式的列过滤 。但是我正在尝试为 R
包实施一个通用解决方案,所以我希望有一个 R
解决方案。
解决方法
我有一种方法在某些情况下行得通。该方法是将原始数字列复制到在呈现时隐藏的新列。但是 'link' 格式化数字 (column
) 到 formatStyle
中的原始数字列 (values_column
)。然后,幸运的是,并不确定为什么,在格式化的列上搜索是有效的。但仅适用于后缀(如 %
),而不适用于前缀($
)或使用逗号表示数千的大数字格式。
每种情况的代码如下。
我不介意使用此解决方法,但对 DT 的内部工作原理了解不够,无法使前缀和其他格式正常工作。
后缀有效
library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
xx <-
datatable(
data = df,
filter = "bottom",
options = list(columnDefs = list(list(
targets = which(stringr::str_detect(colnames(df), "hide")), visible = FALSE
)))
)
xx$x$data$hide_b <- xx$x$data$b
xx$x$data$b <- paste(xx$x$data$b, "%")
attr(xx$x, "colnames") <- colnames(xx$x$data)
xx %>%
formatStyle(
columns = "b",
valueColumns = "hide_b"
)
前缀失败
library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
xx <-
datatable(
data = df,
filter = "bottom",
options = list(columnDefs = list(list(
targets = which(stringr::str_detect(colnames(df), "hide")), visible = FALSE
)))
)
xx$x$data$hide_b <- xx$x$data$b
xx$x$data$b <- paste("$", xx$x$data$b)
attr(xx$x, "colnames") <- colnames(xx$x$data)
xx %>%
formatStyle(
columns = "b",
valueColumns = "hide_b"
)
大数失败
library(DT)
a <- letters[1:10]
b <- 1:10*10^6
df <- data.frame(a, b)
xx <-
datatable(
data = df,
filter = "bottom",
options = list(columnDefs = list(list(
targets = which(stringr::str_detect(colnames(df), "hide")), visible = FALSE
)))
)
xx$x$data$hide_b <- xx$x$data$b
xx$x$data$b <- format(xx$x$data$b,digits = 1, scientific = FALSE, big.mark = ",")
attr(xx$x, "colnames") <- colnames(xx$x$data)
xx %>%
formatStyle(
columns = "b",
valueColumns = "hide_b"
)
在 Shiny 应用程序中使用 DR::renderDT
和 server=TRUE
(默认值)可以使用常规 DT::format*
函数解决此问题。在 Shiny
上下文之外,示例仍然不起作用。但这对我来说是无关紧要的,因为表格将放在闪亮的应用程序中。
已在 DT 的最新开发版本中修复。格式化不再破坏过滤。
对 DT::datatable()
中的列应用格式设置时,DataTables 自动列过滤器不起作用。例如:
library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
datatable(df, filter="bottom") %>% formatCurrency(columns = "b", currency = "$")
列 b
的过滤器失败。
我认为这是一个非常普遍的问题,必须有一个解决方案。我一直在寻找,但到目前为止没有成功。如果有人指出我已解决此问题,将不胜感激。
我知道通过使用 DT 网站上的 JS
回调函数(https://rstudio.github.io/DT/options.html 参见 4.5 行渲染和 运行 它与 filter="top"
),可以使用 格式的列过滤 。但是我正在尝试为 R
包实施一个通用解决方案,所以我希望有一个 R
解决方案。
解决方法
我有一种方法在某些情况下行得通。该方法是将原始数字列复制到在呈现时隐藏的新列。但是 'link' 格式化数字 (column
) 到 formatStyle
中的原始数字列 (values_column
)。然后,幸运的是,并不确定为什么,在格式化的列上搜索是有效的。但仅适用于后缀(如 %
),而不适用于前缀($
)或使用逗号表示数千的大数字格式。
每种情况的代码如下。
我不介意使用此解决方法,但对 DT 的内部工作原理了解不够,无法使前缀和其他格式正常工作。
后缀有效
library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
xx <-
datatable(
data = df,
filter = "bottom",
options = list(columnDefs = list(list(
targets = which(stringr::str_detect(colnames(df), "hide")), visible = FALSE
)))
)
xx$x$data$hide_b <- xx$x$data$b
xx$x$data$b <- paste(xx$x$data$b, "%")
attr(xx$x, "colnames") <- colnames(xx$x$data)
xx %>%
formatStyle(
columns = "b",
valueColumns = "hide_b"
)
前缀失败
library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
xx <-
datatable(
data = df,
filter = "bottom",
options = list(columnDefs = list(list(
targets = which(stringr::str_detect(colnames(df), "hide")), visible = FALSE
)))
)
xx$x$data$hide_b <- xx$x$data$b
xx$x$data$b <- paste("$", xx$x$data$b)
attr(xx$x, "colnames") <- colnames(xx$x$data)
xx %>%
formatStyle(
columns = "b",
valueColumns = "hide_b"
)
大数失败
library(DT)
a <- letters[1:10]
b <- 1:10*10^6
df <- data.frame(a, b)
xx <-
datatable(
data = df,
filter = "bottom",
options = list(columnDefs = list(list(
targets = which(stringr::str_detect(colnames(df), "hide")), visible = FALSE
)))
)
xx$x$data$hide_b <- xx$x$data$b
xx$x$data$b <- format(xx$x$data$b,digits = 1, scientific = FALSE, big.mark = ",")
attr(xx$x, "colnames") <- colnames(xx$x$data)
xx %>%
formatStyle(
columns = "b",
valueColumns = "hide_b"
)
在 Shiny 应用程序中使用 DR::renderDT
和 server=TRUE
(默认值)可以使用常规 DT::format*
函数解决此问题。在 Shiny
上下文之外,示例仍然不起作用。但这对我来说是无关紧要的,因为表格将放在闪亮的应用程序中。
已在 DT 的最新开发版本中修复。格式化不再破坏过滤。