阅读了一些内容后的源代码sliderInput https://github.com/rstudio/shiny/blob/2ce18ef3248bdeebdfadf7846fa61bfbf1b064a0/inst/www/shared/shiny.js#L6159我发现默认的debounce
行为(参见the getRatePolicy本文的部分 https://shiny.rstudio.com/articles/building-inputs.html)的滑块仅在没有a的情况下才被粘附data-immediate
HTML 代码中的属性。
也就是说,我们只需将此属性添加到 HTML 中,滑块就会立即做出反应。
Note.如果你查看之前引用的源代码,你会发现receiveMessage
将重置immediate
to false
. receiveMessage
每当我们使用时都会被调用updateSliderInput
。因此,调用后updateSliderInput
我们必须重新分配immediate
data 属性以便仍然看到行为。
在下面的示例中,您会看到被修改的滑块的值会立即更新,而第二个滑块则显示默认行为。点击一下update
会将这种行为转变为某种附带损害,如果您想使用updateSliderInput
,您应该确保data-immediate
再次添加属性(代码为reset
按钮显示了一种可能的方法)。
但是,请注意,闪亮的团队很可能有一个原因没有向最终用户公开此功能,因此该解决方案应被视为黑客并谨慎使用。 (从源代码来看,他们使用了immediate
使用时属性推翻默认速率策略updateSliderInput
(因此receiveMessage
).
library(shiny)
library(shinyjs)
my_sld <- function(...) {
sld <- sliderInput(...)
sld$children[[2]]$attribs$`data-immediate` <- "true"
sld
}
shinyApp(
fluidPage(
useShinyjs(),
my_sld("sld1", "Immediate:", 1, 10, 1),
verbatimTextOutput("dbg1"),
sliderInput("sld2", "Debounced:", 1, 10, 1),
verbatimTextOutput("dbg2"),
actionButton("update", "Update kills Immediateness"),
actionButton("reset", "Re-add immediate attribute")
),
function(input, output, session) {
output$dbg1 <- renderPrint(input$sld1)
output$dbg2 <- renderPrint(input$sld2)
observeEvent(input$update, {
updateSliderInput(session, "sld1", value = 8)
})
observeEvent(input$reset, {
runjs("$('#sld1').data('immediate', true);")
})
})