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

change numericInput value based on current value when user changes another input

我正在创建一个以英寸为单位的闪亮应用程序,但希望允许用户将单位更改为厘米。当用户更改单位(在任一方向)时,我希望 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 .我怎样才能让它按预期工作?

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

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

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