当用户更改另一个输入时,根据当前值更改numericInput值

时间:2015-02-04 22:02:42

标签: r shiny

我正在创建一个基于英寸的闪亮应用,但是希望允许用户将单位更改为厘米。当用户更改单位(在任一方向)时,我希望numericInput的当前值适当更改。以下是我的想法:

shinyApp(
  ui = fluidPage(
    numericInput("length","Length",1),
    radioButtons("units", "Units", c(Inches="inches", Centimeters="cms"))
  ),
  server = function(input,output,session) {
    observe({
      updateNumericInput(session, inputId="length", value=ifelse(input$units=="cms", input$length*2.54,input$length/2.54))
    })
  }
)

正如您将看到的,如果您运行应用程序,目前我的代码存在的问题是存在无限循环,因为当input$length发生更改时,observe会再次被调用input$length }得到更新,模式重复。

默认情况下,input$length=1input$units="inches"。我想要发生的是,如果用户更改为input$units="cms",则input$length会更改为2.54。如果用户随后更改回英寸,则input$length会更改回1。此时,如果用户将input$length更改为2,然后将input$units更改为"cms",则input$length应更新为5.08 。我怎样才能让它按照需要运作?

我不确定如何编程的想法是observe仅在input$units更改时运行,而不是在input$unitsinput$length更改时运行,但我当然愿意接受任何解决方案。

1 个答案:

答案 0 :(得分:1)

这是isolate的作业:当您不希望输入中的更改触发事件时,您可以isolate包含输入的表达式。尝试:

updateNumericInput(session, inputId="length", value=ifelse(input$units=="cms", isolate(input$length)*2.54,isolate(input$length)/2.54))