我正在创建一个基于英寸的闪亮应用,但是希望允许用户将单位更改为厘米。当用户更改单位(在任一方向)时,我希望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=1
和input$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$units
或input$length
更改时运行,但我当然愿意接受任何解决方案。
答案 0 :(得分:1)
这是isolate
的作业:当您不希望输入中的更改触发事件时,您可以isolate
包含输入的表达式。尝试:
updateNumericInput(session, inputId="length", value=ifelse(input$units=="cms", isolate(input$length)*2.54,isolate(input$length)/2.54))