A note on Shiny reactivity
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In the ‘shiny’ package, the reactiveConsole function allows
to enable reactivity at the console, for the purposes of experimentation
and learning (that doesn’t work in a R Markdown document).
library(shiny) reactiveConsole(TRUE)
So let’s play with the Shiny reactivity, without a Shiny app.
The code below creates an observer which observes a reactive value:
x <- reactiveVal(NULL)
observeEvent(x(), {
print("An event has occured.")
})
Recall that x is a function; when calling it with an
argument, this sets the value, and when calling it without argument,
this read the value.
Let’s try it:
> x(2) # observer triggered [1] "An event has occured." [1] "The value of x is 2" > x(2) # observer not triggered, because same value > x(-2) # observer triggered [1] "An event has occured." [1] "The value of x is -2"
Nothing surprising. Everybody knows that.
Now, let’s define a reactive conductor which calculates the
square of our reactive value, and let’s observe its value:
x <- reactiveVal(NULL)
xsquared <- reactive({
x()^2
})
observeEvent(xsquared(), {
print("An event has occured.")
print(paste("The value of x² is", xsquared()))
})
What happens if we execute the same code as before? The same output as before? The answer is no:
> x(2) # observer triggered [1] "An event has occured." [1] "The value of x² is 4" > x(2) # observer not triggered, because nothing has changed > x(-2) # observer triggered, while x² has not changed! [1] "An event has occured." [1] "The value of x² is 4"
This is an important difference between a reactive value and a reactive
conductor. The reactive conductor is also an observer, and here it
observes the reactive value x(). Then it reacts when
x() changes and even though its output does not change, it
triggers an event.
Note that an observer observing x()^2 is also triggered
when x() takes the value 2 then
-2:
x <- reactiveVal(NULL)
observeEvent(x()^2, {
print("An event has occured.")
}, ignoreInit = TRUE)
> x(2)
[1] "An event has occured."
> x(-2)
[1] "An event has occured."
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.