如何抑制 R Shiny 的 numericInput 即时更新?

How to suppress R Shiny's numericInput instant update?

我对 R shiny 的数字输入行为有以下问题。考虑以下片段:

ui <- basicPage(
  numericInput("example","Example",value=0),
  verbatimTextOutput("changelog")
)

server <- function(input,output){
  output$changelog <- renderPrint(input$example)
}

shinyApp(ui,server)

假设我想将 example 输入字段更新为 12345。我的问题是默认事件侦听器会对每次击键做出反应。因此,在我最终获得所需的 12345 值之前,输入字段将设置为 1121231234。每个数字输入集之后都会进行昂贵的计算 - 所以这是一种非常不受欢迎的行为。

我要做的是修改此行为,以便事件侦听器仅在用户点击输入或离开输入字段时对数字输入做出反应。我目前有两种方法:

  1. reactiveValue 与更新 actionButton 结合使用,以便仅在用户单击更新时更新输入。我觉得这是一个不优雅的解决方案,只是推卸了原来的问题而不解决它。
  2. 直接修改本地shiny.js文件,去掉keyup.textInputBinding事件。这会导致 运行 闪亮的应用程序在其他计算机上出现另一个问题,并且会使所有 numericInput.
  3. 的修改后的行为统一

我想知道是否有人对此有 solution/suggestion?最好是不涉及更改本地 shiny.js 文件的内容。我猜一个解决方案将涉及使用 shinyjs::runjs 手动取消订阅 keyup.textInputBinding 事件 - 但我不知道 JavaScript 足以执行它。

您可以使用 debouncethrottle 来减慢频繁失效的速度。在你的情况下,我的第一个猜测是 debounce:去抖动意味着无效被推迟了毫秒。

反应式表达式只会在 window 过去之前有效,而不会出现后续无效,这可能会产生如下效果:ooo-oo-oo---- => ----- ------o-

你的情况:

library(shiny)

ui <- basicPage(
  numericInput("example","Example",value=0),
  verbatimTextOutput("changelogImmediate"),
  verbatimTextOutput("changelog")
)

server <- function(input,output){
  exampleInput <- reactive(input$example) %>% debounce(1000)
  # debouncedExampleInput <- exampleInput

  output$changelogImmediate <- renderPrint(input$example)
  output$changelog <- renderPrint(exampleInput())
}

shinyApp(ui,server)