reactlog extends Shiny with new features that make it easier to debug and trace reactivity, especially in larger apps.

Analyze the reactive log from R

  • Print the call stack that caused invalidation (rstudio/shiny#1846)
  • List reactive dependencies

Demo

Reactive log visualizer enhancements

Demo

Installation

# install.packages("devtools")
devtools::install_github("glin/reactlog")

Usage

traceInvalidation()

options(shiny.reactlog = TRUE)

rxA <- reactive({
  input$A
})

observe({
  # call it in a reactive context
  reactlog::traceInvalidation()
  rxA()
})

# or on a reactive expression/observer
reactlog::traceInvalidation(rxA)

listDependencies()

reactive({
  # when multiple dependencies change, it might be useful to see them all
  # not just the one that invalidated the context
  reactlog::listDependencies()
  rxA() + input$A + input$B
})

# also works
reactlog::listDependencies(rxA, invalidated = TRUE)

# when called without a reactive context, shows the entire dependency tree
reactlog::listDependencies()

showReactGraph()

# show the graph for the most recent session
reactlog::showReactGraph()

observe({
  # show the graph filtered on this observer and its dependencies
  reactlog::showReactGraph()
})

Caveats

reactlog is experimental and relies on Shiny internals which are subject to change. Use at your own risk, for debugging and development only!