当用户更改另一个输入时,根据当前值更改 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=1
和 input$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$units
或 input$length
变化,但我当然愿意接受任何解决方案。
这是 isolate
的工作:当您不希望输入的更改触发事件时,您可以 isolate
包含输入的表达式。尝试:
updateNumericInput(session, inputId="length", value=ifelse(input$units=="cms", isolate(input$length)*2.54,isolate(input$length)/2.54))
我正在创建一个以英寸为单位的闪亮应用程序,但希望允许用户将单位更改为厘米。当用户更改单位(在任一方向)时,我希望 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
.我怎样才能让它按预期工作?
一个我不确定如何编程的想法是仅在 input$units
更改时使用 observe
运行 而不是 input$units
或 input$length
变化,但我当然愿意接受任何解决方案。
这是 isolate
的工作:当您不希望输入的更改触发事件时,您可以 isolate
包含输入的表达式。尝试:
updateNumericInput(session, inputId="length", value=ifelse(input$units=="cms", isolate(input$length)*2.54,isolate(input$length)/2.54))