diff --git a/DESCRIPTION b/DESCRIPTION index 93fa945..b9560e3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,13 +32,12 @@ Language: en-GB Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.1 Imports: - rlang, targets, - terra + rlang, + cli Suggests: + terra, testthat (>= 3.0.0) -Depends: - R (>= 4.1.0) Config/testthat/edition: 3 URL: https://github.com/njtierney/geotargets BugReports: https://github.com/njtierney/geotargets/issues diff --git a/R/tar-terra-rast.R b/R/tar-terra-rast.R index 99a0191..ffd01b1 100644 --- a/R/tar-terra-rast.R +++ b/R/tar-terra-rast.R @@ -49,6 +49,8 @@ tar_terra_rast <- function(name, retrieval = targets::tar_option_get("retrieval"), cue = targets::tar_option_get("cue")) { + check_pkg_installed("terra") + name <- targets::tar_deparse_language(substitute(name)) envir <- targets::tar_option_get("envir") @@ -65,8 +67,12 @@ tar_terra_rast <- function(name, tidy_eval = tidy_eval ) + drv <- get_gdal_available_driver_list("raster") + # if not specified by user, pull the corresponding geotargets option filetype <- filetype %||% geotargets_option_get("gdal.raster.driver") + filetype <- rlang::arg_match0(filetype, drv$name) + gdal <- gdal %||% geotargets_option_get("gdal.raster.creation_options") targets::tar_target_raw( @@ -96,13 +102,9 @@ tar_terra_rast <- function(name, #' @noRd create_format_terra_raster <- function(filetype, gdal, ...) { - if (!requireNamespace("terra")) { - stop("package 'terra' is required", call. = FALSE) - } + check_pkg_installed("terra") - # get list of drivers available for writing depending on what the user's GDAL supports - drv <- terra::gdal(drivers = TRUE) - drv <- drv[drv$type == "raster" & grepl("write", drv$can), ] + drv <- get_gdal_available_driver_list("raster") filetype <- filetype %||% geotargets_option_get("gdal.raster.driver") filetype <- rlang::arg_match0(filetype, drv$name) diff --git a/R/tar-terra-vect.R b/R/tar-terra-vect.R index 6efbe3e..b3441c7 100644 --- a/R/tar-terra-vect.R +++ b/R/tar-terra-vect.R @@ -57,6 +57,9 @@ tar_terra_vect <- function(name, storage = targets::tar_option_get("storage"), retrieval = targets::tar_option_get("retrieval"), cue = targets::tar_option_get("cue")) { + + check_pkg_installed("terra") + name <- targets::tar_deparse_language(substitute(name)) envir <- targets::tar_option_get("envir") @@ -72,8 +75,12 @@ tar_terra_vect <- function(name, tidy_eval = tidy_eval ) + drv <- get_gdal_available_driver_list("vector") + # if not specified by user, pull the corresponding geotargets option filetype <- filetype %||% geotargets_option_get("gdal.vector.driver") + filetype <- rlang::arg_match0(filetype, drv$name) + gdal <- gdal %||% geotargets_option_get("gdal.vector.creation_options") format <- ifelse( @@ -113,13 +120,9 @@ tar_terra_vect <- function(name, #' @noRd create_format_terra_vect <- function(filetype, options, ...) { - if (!requireNamespace("terra")) { - stop("package 'terra' is required", call. = FALSE) - } + check_pkg_installed("terra") - # get list of drivers available for writing depending on what the user's GDAL supports - drv <- terra::gdal(drivers = TRUE) - drv <- drv[drv$type == "vector" & grepl("write", drv$can), ] + drv <- get_gdal_available_driver_list("vector") if (is.null(filetype)) { filetype <- "GeoJSON" @@ -152,9 +155,7 @@ create_format_terra_vect <- function(filetype, options, ...) { #' @noRd create_format_terra_vect_shz <- function(options, ...) { - if (!requireNamespace("terra")) { - stop("package 'terra' is required", call. = FALSE) - } + check_pkg_installed("terra") .write_terra_vector <- eval(substitute(function(object, path) { terra::writeVector( diff --git a/R/utils.R b/R/utils.R index c1dd32b..9d21a94 100644 --- a/R/utils.R +++ b/R/utils.R @@ -4,3 +4,19 @@ geotargets_repair_option_name <- function(option_name) { option_name <- paste0("geotargets.", option_name) } } + +check_pkg_installed <- function(pkg, call = rlang::caller_env()) { + if (!requireNamespace(pkg, quietly = TRUE)) { + cli::cli_abort( + message = "package {.pkg {pkg}} is required", + call = call + ) + } +} + +get_gdal_available_driver_list <- function(driver_type){ + # get list of drivers available for writing depending on what the user's GDAL supports + drv <- terra::gdal(drivers = TRUE) + drv <- drv[drv$type == driver_type & grepl("write", drv$can), ] + drv +}