【问题标题】:R Shiny - How to update a SINGLE input with Multiple input methodsR Shiny - 如何使用多种输入法更新单个输入
【发布时间】:2019-06-15 00:04:22
【问题描述】:

我想使用两种方法来更新 SINGLE 输入。
假设我想使用 NumericInput 和 SliderInput。

当我将 NumericInput 更新为 5 时,SliderInput 应该更新为 5。
不管我上面说什么,我已经看到了很多例子。
但是我该怎么做呢? (互相更新)
现在如果我将 SliderInput 更新为 6,如何让我的 NumericInput 更新为 6?

这是我尝试过但没有奏效的方法:

ui <- fluidPage(
numericInput("year", "", min = 1979, max = 2017, value = 1979),
sliderInput("year", "Select Year", min = 1979, max = 2017, value = 1979)
)

#===================================================

server <- function(input, output, session) {
  observe(input$year,  {
    updateSliderInput(session, "year", value = year)
  })

  observe(input$year,  {
    updateNumericInput(session, "year", value = year)
  })

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    这可以防止每次输入刷新的问题,因为更新输入元素会刷新其对应的输入,这将触发刷新原始控件。这在最好的情况下确实会重复工作,并且在与其他功能结合使用时会产生不可预测的后果或最坏的情况是无限循环。 更新一个常见的隐藏变量可以解决这个问题。它还允许任意数量的控件影响变量,而不会发生不必要的刷新。

    ui <- fluidPage(
      numericInput("year", "", min = 1979, max = 2017, value = 1979),
      sliderInput("year2", "Select Year", min = 1979, max = 2017, value = 1979),
      textOutput("variableprint")
    )
    
    #===================================================
    
    server <- function(input, output, session) {
      reactiveVar <- reactiveValues(commonHiddenVar = NULL)
      observeEvent(input$year,  {
        if(identical(input$year, input$year2)){
          print("update1") #for testing
          reactiveVar$commonHiddenVar <- input$year
        } else {
          updateSliderInput(session, "year2", value = input$year)
        }
      })
    
      observeEvent(input$year2,  {
        if(identical(input$year, input$year2)){
          print("update2") #for testing
          reactiveVar$commonHiddenVar <- input$year2
        } else {
          updateNumericInput(session, "year", value = input$year2)
        }
      })
      output$variableprint <- renderText(reactiveVar$commonHiddenVar)
    }
    
    shinyApp(ui, server)
    

    您会注意到“update1”或“update2”只会打印一次。如果将这些添加到另一个答案中,它们将同时打印。

    【讨论】:

      【解决方案2】:

      你的意思是这样的吗?

      ui <- fluidPage(
        numericInput("year", "", min = 1979, max = 2017, value = 1979),
        sliderInput("year2", "Select Year", min = 1979, max = 2017, value = 1979)
      )
      
      #===================================================
      
      server <- function(input, output, session) {
        observeEvent(input$year,  {
          updateSliderInput(session, "year2", value = input$year)
        })
      
        observeEvent(input$year2,  {
          updateNumericInput(session, "year", value = input$year2)
        })
      }
      
      
      
      shinyApp(ui, server)
      

      【讨论】:

      • 天啊,是的!非常感谢!
      • 注意,如果更新其中一个控件,后续更新另一个控件本身会触发同一个控件的更新。当使用这些变量之一触发其他函数时,这可能会产生意想不到的后果,因为它们会更新两次。
      猜你喜欢
      • 2020-02-01
      • 2015-12-06
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多