簡體   English   中英

如何過濾(搜索)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列的過濾器失敗。

我認為這是一個足夠普遍的問題,必須有一個解決方案。 我一直在尋找,但到目前為止沒有成功。 如果有人指出我解決了這個問題,將不勝感激。

I am aware that by using the JS callback function on the DT website ( https://rstudio.github.io/DT/options.html see 4.5 Row rendering and run it with filter="top" ), one can filter with formatted列。 但我正在嘗試為R package 實施通用解決方案,所以我希望有一個R解決方案。

解決方法

我有一種在某些情況下有效的方法。 方法是將原始數字列復制到渲染時隱藏的新列。 但是將格式化數字( 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"
  )

已在 DT 的最新開發版本中修復。 格式化不再破壞過濾。

在 Shiny 應用程序中使用帶有server=TRUE (默認值)的DR::renderDT可以使用常規DT::format*函數解決此問題。 Shiny上下文之外,這些示例仍然不起作用。 但這在我的情況下無關緊要,因為表格將在 Shiny 應用程序中使用 go。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM