rstudio / DT

R Interface to the jQuery Plug-in DataTables
https://rstudio.github.io/DT/
Other
598 stars 181 forks source link

`clearSearch` sends multiple copies of the table to the client #1149

Open dfriend21 opened 1 month ago

dfriend21 commented 1 month ago

The clearSearch function appears to send multiple copies of the data table to the client. Here's a reproducible example. To see the issue, open up the inspector in your browser, go to the "Network" tab, and then click on the "clear search" button. You'll see all the requests come through. If you look at the responses, you'll notice that they are all identical (except for the "draw" property, which increments after each request).

library(DT)
library(shiny)

ui <- fluidPage(
  DT::dataTableOutput("table"),
  actionButton("clear_search", "clear search")
)

server <- function(input, output, session) {

  df <- do.call(rbind, lapply(1:1000, function(x) mtcars))

  output$table <- DT::renderDataTable(df, server = TRUE, filter = "top")

  observeEvent(input$clear_search, {
    dataTableProxy("table") |>
      clearSearch()
  })
}

shinyApp(ui, server)

Screenshot 2024-08-23 155344

The number of requests is equal to the number of columns plus one - my guess is one for each column plus the global search? This means that the more columns there are, the more duplicate copies there are. While in this case it doesn't cause much noticeable lag, it becomes an issue for very large datatables with lots of columns.

This issue also interacts with another issue: #504. That issue explains how the JSON object includes a vector that contains one element for each row, which makes the requests unnecessarily large for very large data tables. In my use case, the data table has over 870,000 rows and 32 columns. Each response ends up being 1.9MB because of the row numbers that are included in the JSON responses, and then this request is repeated 32 times, which means we're transferring a lot of unnecessary data every time the search is cleared.

I've done a bit of digging through the code, and this is the JavaScript code that's updating the search:

https://github.com/rstudio/DT/blob/4e63a4664d9caa9fb9d4fb17061ce5eab94bec18/inst/htmlwidgets/datatables.js#L1412C1-L1429C6

I'm assuming the problem lies in here somewhere?

Session info
``` R version 4.4.1 (2024-06-14 ucrt) Platform: x86_64-w64-mingw32/x64 Running under: Windows 11 x64 (build 22631), RStudio c(2024, 4, 2, 764) Locale: LC_COLLATE=English_United States.utf8 LC_CTYPE=English_United States.utf8 LC_MONETARY=English_United States.utf8 LC_NUMERIC=C LC_TIME=English_United States.utf8 Package version: base64enc_0.1.3 bslib_0.8.0 cachem_1.1.0 cli_3.6.3 crosstalk_1.2.1 digest_0.6.36 DT_0.33.1 evaluate_0.24.0 fastmap_1.2.0 fontawesome_0.5.2 fs_1.6.4 glue_1.7.0 graphics_4.4.1 grDevices_4.4.1 highr_0.11 htmltools_0.5.8.1 htmlwidgets_1.6.4 httpuv_1.6.15 jquerylib_0.1.4 jsonlite_1.8.8 knitr_1.48 later_1.3.2 lazyeval_0.2.2 lifecycle_1.0.4 magrittr_2.0.3 memoise_2.0.1 methods_4.4.1 mime_0.12 promises_1.3.0 R6_2.5.1 rappdirs_0.3.3 Rcpp_1.0.13 rlang_1.1.4 rmarkdown_2.28 sass_0.4.9 stats_4.4.1 tinytex_0.52 tools_4.4.1 utils_4.4.1 xfun_0.46 yaml_2.3.10 ```

By filing an issue to this repo, I promise that

I understand that my issue may be closed if I don't fulfill my promises.