If you’ve historically used R interactively, you may find it difficult to define functions that get executed at once without your input as Plumber requires. There are a couple of debugging techniques to be aware of when working on your Plumber APIs; these techniques are equally transferable to debugging your R scripts, packages, or reports.

Interactive Debugging

Print debugging is an obvious starting point, but most developers eventually wish for something more powerful. In R, this capacity is built in to the browser() function. If you’re unfamiliar, browser() pauses the execution of some function and gives you an interactive session in which you can inspect the current value of internal variables or even proceed through your function one statement at a time.

You can leverage browser() when developing your APIs locally by adding a browser() call in one of your filters or endpoints and then visiting your API in a client. This offers a powerful technique to use when you want to inspect multiple different variables or interact with the current state of things inside of your function. This is also a good way to get your hands dirty with Plumber and get better acquainted with how things behave at a low level. Consider the following API endpoint:

#* @get /
function(req, res){


If you run this API locally and then visit the API in a web browser, you’ll see your R session switch into debug mode when the request arrives, allowing you to look at the objects contained inside your req and res objects.

Plumber Server

Port Range

You can use [httpuv::randomPort()] to define a range of port for Plumber to pick from when running an API.

# plumber.R
options("plumber.port" = httpuv::randomPort(min = 4000, max = 7000, n = 100))

### define the rest of your plumber router...

or more programmatically

pr() %>%
  pr_run(port = httpuv::randomPort(min = 4000, max = 7000, n = 100))