R Shiny-如何使用多种输入法更新单输入

时间:2019-03-30 07:16:38

标签: r shiny

我想使用两种方法来更新单个输入。
假设我要使用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)
  })

2 个答案:

答案 0 :(得分: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”仅打印一次。如果在其他答案中添加了这些内容,则会同时打印两者。

答案 1 :(得分:0)

你的意思是这样吗?

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)