my_function <- function(x) {
y <- x + 10
browser()
z <- y / 2
return(z)
}
my_function(5)R tips July 2025
R-tips
A practical, hands-on introduction to debugging in R. We explore core tools (browser(), debugonce(), traceback(), recover()) and demonstrate how to apply them in both scripts and Shiny applications, with live examples and step-by-step guidance to streamline your workflow.
Debugging in R: Practical Tools and Techniques
Introduction
Debugging is essential in programming for identifying and resolving errors effectively. Good debugging skills enhance productivity and ensure code reliability.
Topics Covered:
browser()debugonce()traceback()recover()- Debugging Shiny applications
The browser() Function
Purpose: Pauses execution, allowing interactive inspection.
Example:
How to use:
- Inspect variables directly.
- Step through code (
nfor next,cto continue).
The debugonce() Function
Purpose: Debugs a function exactly once.
Example:
add_numbers <- function(a, b) {
sum <- a + b
return(sum)
}
debugonce(add_numbers)
add_numbers(3, "two")How to use:
- Automatically enters debug mode at next call.
- Useful for inspecting unexpected errors inside functions.
The traceback() Function
Purpose: Identifies the call sequence leading to an error.
Example:
func_a <- function() { func_b() }
func_b <- function() { stop("An error occurred!") }
func_a()
traceback()How to use:
- Quickly identifies problematic calls.
- Ideal for debugging nested functions.
The recover() Function
Purpose: Interactive debugging at the moment an error occurs.
Set this first:
options(error = recover)
f1 <- function(x) { f2(x) }
f2 <- function(x) { f3(x) }
f3 <- function(x) { stop("Unexpected error!") }
f1(10)How to use:
- Provides menu to enter error environments.
- Inspect variables interactively.
Debugging Shiny Applications
Debugging Shiny can be challenging. Key approaches include:
- Use
browser()in reactive contexts:
library(shiny)
ui <- fluidPage(
numericInput("num", "Number:", 10),
textOutput("result")
)
server <- function(input, output) {
output$result <- renderText({
browser()
paste("Double:", input$num * 2)
})
}
shinyApp(ui, server)- Monitor logs and console outputs.
Summary: Key Takeaways
browser()- Interactive inspection.debugonce()- Single-use debugging.traceback()- Error call sequence.recover()- Interactive error handling.- Shiny apps - Combine
browser(), logging, and output checks.
Effective debugging greatly enhances coding efficiency and reliability.