skip_if_no_prioritizr <- function() { testthat::skip_if_not_installed("prioritizr") } build_prioritizr_basic <- function(toy, target = 0.5, boundary_matrix = NULL) { skip_if_no_prioritizr() pu <- toy$pu feat_wide <- reshape( toy$dist_features, idvar = "pu", timevar = "feature", direction = "wide" ) dat <- merge(pu, feat_wide, by.x = "id", by.y = "pu", all.x = TRUE, sort = FALSE) dat[is.na(dat)] <- 0 names(dat) <- sub("^amount\\.", "feature_", names(dat)) p <- prioritizr::problem( dat, features = paste0("feature_", toy$features$id), cost_column = "cost" ) |> prioritizr::add_min_set_objective() |> prioritizr::add_relative_targets(target) if (!is.null(boundary_matrix)) { p <- p |> prioritizr::add_boundary_penalties( penalty = 1, data = boundary_matrix ) } p } solve_prioritizr <- function(x, ...) { get("solve", envir = asNamespace("prioritizr"))(x, ...) }