Saat menerapkan pemformatan ke kolom di DT::datatable(), filter kolom otomatis DataTables tidak berfungsi. Sebagai contoh:

library(DT)
a <- letters[1:10]
b <- 1:10
df <- data.frame(a, b)
datatable(df, filter="bottom") %>% formatCurrency(columns = "b", currency = "$")

Filter untuk kolom b gagal.

Saya pikir ini adalah masalah yang cukup umum sehingga harus ada solusi. Saya telah mencari, tetapi sejauh ini tidak berhasil. Akan berterima kasih jika seseorang mengarahkan saya ke tempat ini telah diselesaikan.

Saya mengetahui bahwa dengan menggunakan fungsi panggilan balik JS di situs web DT (https:// /rstudio.github.io/DT/options.html lihat 4.5 Render baris dan jalankan dengan filter="top"), seseorang dapat memfilter dengan kolom berformat. Tetapi saya mencoba menerapkan solusi umum untuk paket R, jadi saya mengharapkan solusi R.

Solusi

Saya memiliki pendekatan yang berhasil dalam beberapa kasus. Pendekatannya adalah menyalin kolom angka mentah ke kolom baru yang disembunyikan saat rendering. Tapi 'tautkan' angka yang diformat (column) ke kolom angka mentah (values_column) di formatStyle. Kemudian, untungnya, dan tidak yakin mengapa, mencari di kolom yang diformat berfungsi. Tetapi hanya dalam kasus sufiks (seperti %), tetapi tidak untuk awalan ($) atau pemformatan angka besar dengan koma untuk ribuan.

Kode untuk masing-masing kasus ini di bawah ini.

Saya tidak keberatan menggunakan solusi ini, tetapi tidak cukup tahu tentang cara kerja DT untuk membuat awalan dan format lain berfungsi.

Sufiks berfungsi

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"
  )

Awalan gagal

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"
  )

Jumlah besar gagal

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"
  )
1
teofil 14 Mei 2020, 03:56

2 jawaban

Jawaban Terbaik

Menggunakan DR::renderDT dengan server=TRUE (default) di dalam aplikasi Shiny memecahkan masalah ini menggunakan fungsi DT::format* biasa. Di luar konteks Shiny, contoh masih tidak berfungsi. Tapi itu tidak relevan dalam kasus saya, karena tabel akan masuk ke aplikasi Shiny.

0
teofil 16 Mei 2020, 12:09

Diperbaiki dalam versi dev terbaru dari DT. Pemformatan tidak lagi merusak pemfilteran.

1
lagerratrobe 5 September 2020, 14:38