We propose a very experimental feature to debug shiny apps, it’s still brittle but we decided to release anyway as it might be useful as is.
You’ll need the code of a shiny app saved in a proper project, and the module structure of the shiny app should follow the recommendations of Hadley Wickham’s book “Mastering Shiny”.
Under these assumptions following
boomer::boom_shinyApp()
is a drop in replacement for
shiny::shinyApp()
, running your app with enhanced debugging
features.
For instance taking an example from “Mastering Shiny”, we can create a file (it needs to be saved in the project!) and fill it with :
histogramUI <- function(id) {
tagList(
selectInput(NS(id, "var"), "Variable", choices = names(mtcars)),
numericInput(NS(id, "bins"), "bins", value = 10, min = 1),
plotOutput(NS(id, "hist"))
)
}
histogramServer <- function(id) {
moduleServer(id, function(input, output, session) {
data <- reactive(mtcars[[input$var]])
output$hist <- renderPlot({
hist(data(), breaks = input$bins, main = input$var)
}, res = 96)
})
}
ui <- fluidPage(
histogramUI("hist1")
)
server <- function(input, output, session) {
histogramServer("hist1")
}
Then after making sure everything is loaded (you might call
devtools::load_all()
in a package project), we can call
boom_shinyApp(ui, server)
and we get the following app
:
We see the same app as we would with shiny::shinyApp()
except it’s nested into an “app” tab and we have an additional “boomer
log options tab”, lets take a look:
In this additional tab we can tick which reactives we want to make verbose.
In our example we defined two reactives in
histogramServer()
: data
and
output$hist
, if we tick
histogramServer/output$hist <- renderPlot(...)
and
select anything that triggers an actualization of the reactive
(i.e. that changes the plot) we will observe verbose output in the
console.
For instance if we set the number of bins to 15 we will see:
We hope that this can save developers from the chore of running and stopping apps repeatedly with different variations of debugging code cluttered in various places.