If you use a plumber decorated file, the function defined there will be evaluated in the router environment.
Since you are building your router programmatically, you are subject to R scoping, so if you want to evaluate a function in a particular environment, use eval.
Example using plumber decoration:
plumber.R
#* @post /path
function(req, res, ...) {
my_function(req = req,
res = res,
data = data)
}
my_function <- function(req, res, data) {
data
}
data <- datasets::iris
api.R
library(plumber)
pr <- plumb("plumber.R")
end <- pr$endpoints[[1]][[1]]
res <- plumber:::PlumberResponse$new()
req <- list()
testthat::expect_equal(end$exec(req = req, res = res), datasets::iris)
Similar, but programmatically
library(plumber)
pr <- pr()
eval(expression({
data <- datasets::iris
my_function <- function(req, res, data) {
data
}
handler <- function(req, res, ...) {
my_function(req = req, res = res, data = data)
}
}), pr$environment)
pr_post(pr, path = "/path", handler = pr$environment$handler)
end <- pr$endpoints[[1]][[1]]
res <- plumber:::PlumberResponse$new()
req <- list()
testthat::expect_equal(end$exec(req = req, res = res), datasets::iris)