В документации observe
и observeEvent
написано:
Наблюдатель похож на реактивное выражение в том смысле, что он может читать реактивные значения и вызывать реактивные выражения, и будет автоматически выполняться при изменении этих зависимостей. [...] [O] bservers используют нетерпеливую оценку; как только их зависимости меняются, они планируют повторное выполнение.
В вашем примере observe
никогда не прекращает "наблюдение" и обновляет ввод, как только другие изменения, даже если пользователь ничего не делает Следовательно, вы находитесь в бесконечном l oop, поскольку каждый из двух входов зависит от другого.
[S] ometimes Вы хотите подождать, пока пользователь не предпримет конкретное действие c, например щелчок по actionButton (), перед вычислением выражения или выполнением действия. [...] Используйте Наблюдение за событием всякий раз, когда вы хотите выполнить действие в ответ на событие.
Следовательно, observeEvent
необходимо, чтобы пользователь выполнил действие для запуска функции внутри. В вашем примере ввод «а» будет обновлен только в том случае, если пользователь вручную изменит ввод «b» и наоборот. Вот почему observeEvent
работает в этом сценарии, а observe
- нет.
Edit: , чтобы получить более четкие результаты для l oop, созданного при использовании observe
, вот немного модифицированная версия примера в OP:
library(shiny)
shinyApp(
ui = fluidPage(
numericInput('a','a', value = NULL, max = 1, min = 0),
numericInput('b','b', value = NULL, 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(paste0("a = ", input$a))
print(paste0("b = ", input$b))
})
# Using separate observers ----
# observeEvent(input$b, {
# updateNumericInput(session, 'a', value = 1-input$b)
# })
#
# observeEvent(input$a, {
# updateNumericInput(session, 'b', value = 1-input$a)
# })
}
)
Осторожно с интерпретацией: печатаются начальные значения a
и b
. Затем создаются новые значения a
и b
, но новое значение b
зависит от первого значения a
(не от второго значения a
). Третьи значения a
и b
будут зависеть от вторых значений a
и b
, et c.