Create a reactive expression — reactive
R/reactives.R
Description
Wraps a normal expression to create a reactive expression. Conceptually, a reactive expression is a expression whose result will change over time.
Arguments
- x
For
is.reactive()
, an object to test. Forreactive()
, an expression. When passing in aquo()
sure withreactive()
, remember to userlang::inject()
to distinguish that you are passing in the content of your quosure, not the expression of the quosure.- env
The parent environment for the reactive expression. By default, this is the calling environment, the same as when defining an ordinary non-reactive expression. If
x
is a quosure andquoted
isTRUE
, thenenv
is ignored.- quoted
If it is
TRUE
, then thequote()
ed value ofx
will be used whenx
is evaluated. Ifx
is a quosure and you would like to use its expression as a value forx
, then you must setquoted
toTRUE
.- ...
Not used.
- label
A label for the reactive expression, useful for debugging.
- domain
See domains.
- ..stacktraceon
Advanced use only. For stack manipulation purposes; see
stacktrace()
.
Value
a function, wrapped in a S3 class "reactive"
Details
Reactive expressions are expressions that can read reactive values and call other reactive expressions. Whenever a reactive value changes, any reactive expressions that depended on it are marked as "invalidated" and will automatically re-execute if necessary. If a reactive expression is marked as invalidated, any other reactive expressions that recently called it are also marked as invalidated. In this way, invalidations ripple through the expressions that depend on each other.
See the Shiny tutorial for more information about reactive expressions.
Examples
library(rlang)
values <- reactiveValues(A=1)
reactiveB <- reactive({
values$A + 1
})
# View the values from the R console with isolate()
isolate(reactiveB())
# 2
# To store expressions for later conversion to reactive, use quote()
myquo <- rlang::quo(values$A + 2)
# Unexpected value! Sending a quosure directly will not work as expected.
reactiveC <- reactive(myquo)
# We'd hope for `3`, but instead we get the quosure that was supplied.
isolate(reactiveC())
# Instead, the quosure should be `rlang::inject()`ed
reactiveD <- rlang::inject(reactive(!!myquo))
isolate(reactiveD())
# 3
# (Legacy) Can use quoted expressions
expr <- quote({ values$A + 3 })
reactiveE <- reactive(expr, quoted = TRUE)
isolate(reactiveE())
# 4