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
 "An event has occured."
 "The value of x is 2"
> x(2)  # observer not triggered, because same value
> x(-2) # observer triggered
 "An event has occured."
 "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
 "An event has occured."
 "The value of x² is 4"
> x(2)  # observer not triggered, because nothing has changed
> x(-2) # observer triggered, while x² has not changed!
 "An event has occured."
 "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)
 "An event has occured."
> x(-2)
 "An event has occured."```