Ответ 1
Использование
currentFib <- reactiveValues({ fib(as.numeric(input$n)) })
не будет работать в этом контексте.
Вы получите сообщение о том, что вы получаете доступ к реактивным значениям вне "реактивного контекста".
Однако, если вы вместо этого перевернете его внутри вызова функции, он будет работать:
currentFib <- function(){ fib(as.numeric(input$n)) }
Это работает, потому что теперь вызов функции находится внутри реактивного контекста.
Различие клавиш - это различие, которое они делают в блестящей документации, между реактивными "источниками" и "проводниками". В этой терминологии reactive({...})
является проводником, но reactiveValues
может быть только источником.
-
Вот как я думаю о
reactiveValues
- как способ расширенияinput
, который указан в UI.R. Иногда слотов вinput
недостаточно, и нам нужны производные значения на основе этих входных слотов. Другими словами, это способ расширить список слотовinput
для будущих реактивных вычислений. -
Reactive()
делает то, что вы говорите, - оно возвращает значение после повторного запуска выражения каждый раз при изменении любого реактивного значения. Если вы посмотрите на исходный код дляreactive
, вы можете увидеть его: Последняя строка - это кэшированное значение, которое возвращается:Observable$new(fun, label)$getValue
где "fun" - это выражение, которое было отправлено при вызовеreactive.