【问题标题】:How to automatically update one input if another was changed?如果另一个输入被更改,如何自动更新一个输入?
【发布时间】:2020-07-02 01:16:47
【问题描述】:

我想从 selectInput 更新 numericInput 的值,反之亦然。当在 numericInput 中手动输入任何值时,我希望 selectInput 更改为选中的“其他”。我还希望在从选择输入中选择“A”、“B”或“C”时更新 numericInput。 我知道最好避免循环引用,但我想知道这是否可行。 这是我到目前为止所拥有的。 The numeric input flashes briefly when "A", "B" or "C" is selected but it changes back to empty and the selected value changes back to other.

library(shiny)

if (interactive()) {
  ui <- fluidPage(
    selectInput(
      "controller",
      NULL,
      c(
        "A" = 35000,
        "B" = 1200,
        "C" = 12231,
        "Other"
      ),selected = "Other"
    ),
    numericInput("inNumber", "Input number", 0)
  )
  
  server <- function(input, output, session) {
    observeEvent(input$controller, {
      x <- input$controller
      updateNumericInput(session, "inNumber", value = x)
    })
    
    observeEvent(input$inNumber,{
        updateSelectInput(session,"controller",selected ="Other")
    })
  }
  
  shinyApp(ui, server)
}

谢谢

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    在我看来,@starja 的解决方案意外重置了数字输入。这是另一个解决方案:

    ui <- fluidPage(
      selectInput(
        "controller",
        NULL,
        c(
          "A" = 35000,
          "B" = 1200,
          "C" = 12231,
          "Other"
        ), selected = "Other"
      ),
      numericInput("inNumber", "Input number", 0)
    )
    
    server <- function(input, output, session) {
      
      flags <- reactiveValues(a=FALSE, b=FALSE)
      
      observeEvent(input$inNumber, {
        if(flags$a) flags$a <- FALSE
      }, ignoreInit = TRUE, priority = 0)
      
      observeEvent(input$inNumber, {
        if(!flags$a && input$controller != "Other"){
          updateSelectInput(session, "controller", selected = "Other")
          flags$a <- flags$b <- TRUE
        }
      }, ignoreInit = TRUE, priority = 1)
      
      observeEvent(input$controller, {
        if(flags$b) flags$b <- FALSE
      }, ignoreInit = TRUE, priority = 0)
      
      observeEvent(input$controller, {
        if(!flags$b){
          updateNumericInput(session, "inNumber", value=input$controller)
          flags$a <- flags$b <- TRUE
        }
      }, ignoreInit = TRUE, priority = 1)
      
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:

      您的问题是从“其他”更改为“A/B/C”会自动触发第二个观察者,但第一次不应该触发,因为这是您要显示的更改。您可以在第一次更改时使用标志来规避此问题。但是感觉不是很好,也许有更好的选择。

      library(shiny)
      
      if (interactive()) {
        ui <- fluidPage(
          selectInput(
            "controller",
            NULL,
            c(
              "A" = 35000,
              "B" = 1200,
              "C" = 12231,
              "Other"
            ),selected = "Other"
          ),
          numericInput("inNumber", "Input number", 0)
        )
        
        server <- function(input, output, session) {
          
          first_change <- FALSE
          
          observeEvent(input$controller, {
            x <- input$controller
            updateNumericInput(session, "inNumber", value = x)
            first_change <<- TRUE
            
          })
          
          observeEvent(input$inNumber,{
            if (!(input$controller == "Other" || first_change)) {
            updateSelectInput(session,"controller",selected ="Other")
            }
            first_change <<- FALSE
            
          })
        }
        
        shinyApp(ui, server)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多