Control/delay 使用 JS/html 的 Shiny DT 数据表的搜索速度
Control/delay the search speed of Shiny DT datatable using JS/html
我有一个带有非常大的 Shiny DT table 的应用程序,我已经成功地使用 [=26] 实现了数据的批量搜索table(在 的帮助下) =].据我了解 table 是实时搜索的,例如,如果我想在 table 中查找以“Ver”开头的项目,一旦我开始输入,搜索就会在我输入第一个字母,所以我必须慢慢等待以“V”开头的项目首先出现,然后等待所有有“Ve”的项目,最后是“Ver”。对于下面的简短示例,这不是问题,但对于某些用户 OS' 和具有许多条目的非常大的 tables 来说,这是一个问题。
总而言之,我不想在用户每次按键时都进行搜索,我想在用户停止输入 x 秒后进行搜索。我认为根据 this post?
这叫做 debouncing
有人可以告诉我这是否可行吗?或者请为我的问题提出替代解决方案?
我在下面包含了一个可重现的示例,它是根据我当前运行良好的应用程序修改而来的(除了 table 的缓慢搜索和更新)。
library(shiny)
library(DT)
callback <- '
$("div.search").append($("#mySearch"));
$("#mySearch").on("keyup redraw", function(){
var splits = $("#mySearch").val().split(" ").filter(function(x){return x !=="";})
var searchString = "(" + splits.join("|") + ")";
table.search(searchString, true).draw(true);
});
'
ui <- fluidPage(
tags$head(tags$style(HTML(".search {float: right;}"))),
br(),
tags$input(type = "text", id = "mySearch", placeholder = "Search"),
DTOutput("dtable")
)
server <- function(input, output){
output[["dtable"]] <- renderDT({
datatable(
iris[c(1,2,51,52,101,102),],
options = list(
dom = "l<'search'>rtip"
),
callback = JS(callback)
)
}, server = FALSE)
}
shinyApp(ui, server)
> sessionInfo()
R version 4.0.0 (2020-04-24)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] DT_0.13 shiny_1.4.0.2
loaded via a namespace (and not attached):
[1] Rcpp_1.0.4.6 digest_0.6.25 later_1.1.0.1 mime_0.9
[5] R6_2.4.1 jsonlite_1.6.1 xtable_1.8-4 magrittr_1.5
[9] evaluate_0.14 rlang_0.4.6 promises_1.1.0 rmarkdown_2.2
[13] tools_4.0.0 htmlwidgets_1.5.1 crosstalk_1.1.0.1 rsconnect_0.8.16
[17] fastmap_1.0.1 httpuv_1.5.4 xfun_0.14 yaml_2.2.1
[21] compiler_4.0.0 htmltools_0.4.0 knitr_1.28
您可以使用setTimeout
来延迟搜索。这里 1 秒(1000 毫秒):
callback <- '
$("div.search").append($("#mySearch"));
$("#mySearch").on("keyup redraw", function(){
var splits = $("#mySearch").val().split(" ").filter(function(x){return x !=="";})
var searchString = "(" + splits.join("|") + ")";
setTimeout(function(){
table.search(searchString, true).draw(true);
}, 1000);
});
'
我有一个带有非常大的 Shiny DT table 的应用程序,我已经成功地使用 [=26] 实现了数据的批量搜索table(在
总而言之,我不想在用户每次按键时都进行搜索,我想在用户停止输入 x 秒后进行搜索。我认为根据 this post?
这叫做 debouncing有人可以告诉我这是否可行吗?或者请为我的问题提出替代解决方案?
我在下面包含了一个可重现的示例,它是根据我当前运行良好的应用程序修改而来的(除了 table 的缓慢搜索和更新)。
library(shiny)
library(DT)
callback <- '
$("div.search").append($("#mySearch"));
$("#mySearch").on("keyup redraw", function(){
var splits = $("#mySearch").val().split(" ").filter(function(x){return x !=="";})
var searchString = "(" + splits.join("|") + ")";
table.search(searchString, true).draw(true);
});
'
ui <- fluidPage(
tags$head(tags$style(HTML(".search {float: right;}"))),
br(),
tags$input(type = "text", id = "mySearch", placeholder = "Search"),
DTOutput("dtable")
)
server <- function(input, output){
output[["dtable"]] <- renderDT({
datatable(
iris[c(1,2,51,52,101,102),],
options = list(
dom = "l<'search'>rtip"
),
callback = JS(callback)
)
}, server = FALSE)
}
shinyApp(ui, server)
> sessionInfo()
R version 4.0.0 (2020-04-24)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] DT_0.13 shiny_1.4.0.2
loaded via a namespace (and not attached):
[1] Rcpp_1.0.4.6 digest_0.6.25 later_1.1.0.1 mime_0.9
[5] R6_2.4.1 jsonlite_1.6.1 xtable_1.8-4 magrittr_1.5
[9] evaluate_0.14 rlang_0.4.6 promises_1.1.0 rmarkdown_2.2
[13] tools_4.0.0 htmlwidgets_1.5.1 crosstalk_1.1.0.1 rsconnect_0.8.16
[17] fastmap_1.0.1 httpuv_1.5.4 xfun_0.14 yaml_2.2.1
[21] compiler_4.0.0 htmltools_0.4.0 knitr_1.28
您可以使用setTimeout
来延迟搜索。这里 1 秒(1000 毫秒):
callback <- '
$("div.search").append($("#mySearch"));
$("#mySearch").on("keyup redraw", function(){
var splits = $("#mySearch").val().split(" ").filter(function(x){return x !=="";})
var searchString = "(" + splits.join("|") + ")";
setTimeout(function(){
table.search(searchString, true).draw(true);
}, 1000);
});
'