R shiny -更新多个输入

utugiqy6  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(132)

这是一个相当常见的问题,我在网上找了几个小时,但无法解决我的问题。
由于使用了三个输入的updateNumericInput,我目前正试图摆脱无限循环(对任何输入的更改都应该触发对其他两个的更新)。我以为通过debouncethrottle添加一些延迟就可以了,但我不能让它工作。下面是我能做的最好的:

library(shiny)

ui <- fluidPage(
  numericInput(inputId = "num",
               label   = "Num:",
               value   = 10,
               min     = 1),
  uiOutput("num1"),
  uiOutput("num2")
)

server <- function(input, output, session) {
  
  num <- reactive({ input$num }) %>% debounce(2000)
  
  output$num1 = renderUI({
    numericInput(inputId = "num1",
                 label   = "Num1:",
                 value   = num(),
                 min     = 1)
  })
  
  output$num2 = renderUI({
    numericInput(inputId = "num2",
                 label   = "Num2:",
                 value   = num(), 
                 min     = 1)
  })
  
  observeEvent(input$num1, {
    updateNumericInput(session, 'num', value = input$num1)
  })
  
  observeEvent(input$num2, {
    updateNumericInput(session, 'num', value = input$num2)
  })
  
}

shinyApp(ui = ui, server = server)

这只是部分工作:更新input$num会使更新num1num2延迟2秒。但是,更新input$num1会立即更新input$num
我尝试去反跳两个observeEvent调用,但失败了。据我所知,去抖只对React值起作用。
所以我也尝试创建React值num1()num2(),并在observeEvent中使用它们。但奇怪的是,这导致了num1num2的变化,并没有触发num的更新。
我怎样才能保持所有三个输入同步,而不进入臭名昭著的无限循环?

x0fgdtte

x0fgdtte1#

下面的代码示例是否适用于您的porpuse:

library(shiny)

ui <- fluidPage(
  numericInput(inputId = "num1",
               label   = "Num_1:",
               value   = 10,
               min     = 1),
  numericInput(inputId = "num2",
               label   = "Num_2:",
               value   = 10,
               min     = 1),
  numericInput(inputId = "num3",
               label   = "Num_3:",
               value   = 10,
               min     = 1),
)

server <- function(input, output, session) {
  
  observeEvent(input$num1, {
    value <- input$num1
    updateNumericInput(session, 'num2', value = value)
    updateNumericInput(session, 'num3', value = value)
  })
  observeEvent(input$num2, {
    value <- input$num2
    updateNumericInput(session, 'num1', value = value)
    updateNumericInput(session, 'num3', value = value)
  })
  observeEvent(input$num3, {
    value <- input$num3
    updateNumericInput(session, 'num1', value = value)
    updateNumericInput(session, 'num2', value = value)
  })
}

shinyApp(ui = ui, server = server)

相关问题