R语言 在观察事件更新数值输入之前添加滞后

wn9m85ua  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个很棒的应用程序,里面有很多数字输入。有些数字依赖于其他数字的值。举个例子,如果输入的input_2较大,我需要修改input_1,比如input_1 = input_2 + 1。问题是,如果用户输入的速度太慢,它会取输入的input_2的第一位数字,比如5。并使input_1等于6,即使您完成键入540。
下面是一个例子:

library(shiny)

ui <- fluidPage(
  numericInput("input1", "Input 1:", 0),
  numericInput("input2", "Input 2:", 0)
)

server <- function(input, output, session) {
  
  
  observeEvent(input$input2, {
    if (input$input2 > input$input1) {
      updateNumericInput(session, "input1", value = input$input2 + 1)
    }
  })
  

}

shinyApp(ui, server)

我试过使用invalidateLater,或者debounce,但是我认为我没有正确地使用它,因为输出仍然几乎是立即改变的。理想情况下,它只在焦点丢失时更新,但是我不想在我的代码中添加js。所以有一个固定的定时器来更新似乎是一个很好的中间地带。有什么想法吗?

dfddblmv

dfddblmv1#

正如您已经提到的,debounce是正确的选择:

library(shiny)

ui <- fluidPage(
  numericInput("input1", "Input 1:", 0),
  numericInput("input2", "Input 2:", 0)
)

server <- function(input, output, session) {
  
  input2_d <- debounce(reactive({input$input2}), 1000L)
  
  observeEvent(input2_d(), {
    if (input2_d() > input$input1) {
      updateNumericInput(session, "input1", value = input2_d() + 1)
    }
  })
}

shinyApp(ui, server)
ifsvaxew

ifsvaxew2#

下面是使用shinyjs包中的delay函数的示例:

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(), # call for shinyjs to be used in the ui part of the dashboard
  numericInput("value1",
               "Value 1:",
               value = 40),
  numericInput("value2",
               "Value 2:",
               value = 50)
)

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

  
  
  observeEvent(input$value1, {
    if (input$value1 > input$value2) {
      delay(2000, # the delay in milliseconds that is imposed
            updateNumericInput(session = session, "value2", value = input$value1 + 1))
    }
  })
  
  
}

shinyApp(ui, server)

在值1应该大于值2的情况下,在2秒之后,值2将被更新为等于1 +值1。

相关问题