如何过滤(搜索)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::renderDTserver=TRUE(默认值)可以使用常规 DT::format* 函数解决此问题。在 Shiny 上下文之外,示例仍然不起作用。但这对我来说是无关紧要的,因为表格将放在闪亮的应用程序中。

已在 DT 的最新开发版本中修复。格式化不再破坏过滤。