如何在R DT(DataTable)中过滤(搜索)格式化的列。

问题描述 投票:1回答:1

当应用格式化的列在 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 失败。

我想这是一个很普遍的问题,一定会有解决办法。我一直在寻找,但至今没有成功。如果有人能给我指出解决这个问题的方法,我将感激不尽。

我知道,通过使用 JS DT网站上的回调函数(https:/rstudio.github.ioDToptions.html。 请看4.5行渲染,并在运行时使用 filter="top"),可以过滤 格式化的列。但是,我正在尝试实现一个通用的解决方案,以实现一个 R 包,所以我希望有一个 R 解决办法。

解决办法

我有一个方法,在某些情况下是有效的。这个方法是将原始数字列复制到一个新的列中,在渲染时隐藏。但 "链接 "格式化的数字(column)到原始数字列(values_column)在 formatStyle. 然后,幸运的是,也不完全知道为什么,在格式化的列上搜索可以。但是,只有在后缀的情况下(如 %),但对前缀则不适用($)或大数格式,千位数用逗号表示。

这些情况的代码都在下面。

我不介意使用这种变通方法,但对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"
  )
javascript r datatables dt
1个回答
0
投票

使用 DR::renderDTserver=TRUE (默认情况下)在Shiny应用内使用常规的 DT::format* 职能。外部 Shiny 的上下文,例子还是不能用。但这与我的情况无关,因为表格会放在Shiny应用中。

© www.soinside.com 2019 - 2024. All rights reserved.