【发布时间】:2020-12-15 17:24:00
【问题描述】:
下面的应用程序有两个相互依赖的数字输入,a 和 b。 input$a 的值为1-input$b,input$b 的值为1-input$a。每当用户更改输入的值时,我想相应地更新另一个的值。下面的代码包含两种方法:
- 单个观察者
- 两个独立的观察者 - 一个监听对 a 的更改并更新 b,另一个监听
b并更新a。
当我尝试 1) 时,输入会陷入无限循环,但我不确定我是否理解原因。如果用户更改b,则触发观察者并且a 的值更新为1-b。由于两个输入的值现在都是最新的,因此input$a 或input$b 没有进一步的更改,并且在用户进行另一项更改之前不应再次触发观察者。但事实并非如此。
方法 1) 与方法 2) 究竟有何不同?为什么 1) 会陷入循环而 2) 不会?
library(shiny)
shinyApp(
ui = fluidPage(
numericInput('a','a', value = 0.5, max = 1, min = 0),
numericInput('b','b', value = 0.5, max = 1, min = 0)
),
server = function(input, output, session) {
# Using a single observer ----
observe({
updateNumericInput(session, 'a', value = 1-req(input$b))
updateNumericInput(session, 'b', value = 1-req(input$a))
print(input$a)
})
# Using separate observers ----
# observeEvent(input$b, {
# updateNumericInput(session, 'a', value = 1-input$b)
# })
#
# observeEvent(input$a, {
# updateNumericInput(session, 'b', value = 1-input$a)
# })
}
)
【问题讨论】: