diff --git a/DESCRIPTION b/DESCRIPTION index 72a92be..d647b4f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: StreamCatTools Type: Package Title: 'StreamCatTools' -Version: 0.8.0 +Version: 0.8.0.9000 Authors@R: c(person(given = "Marc", family = "Weber", role = c("aut", "cre"), diff --git a/NEWS.md b/NEWS.md index 3cb0c5e..67a5a34 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,5 @@ +# StreamCatTools (development version) + # StreamCatTools 0.8.0 - Added code coverage to the package diff --git a/R/lc_get_data.R b/R/lc_get_data.R index 3e82bf1..4d3200f 100644 --- a/R/lc_get_data.R +++ b/R/lc_get_data.R @@ -136,7 +136,8 @@ lc_get_data <- function(comid = NULL, state=state,county=county,region=region,conus=conus, countOnly=countOnly ) - df <- req |> + df <- tryCatch({ + req |> httr2::req_method("POST") |> httr2::req_headers("Content-Type" = "application/x-www-form-urlencoded") |> httr2::req_method("POST") |> @@ -146,12 +147,24 @@ lc_get_data <- function(comid = NULL, httr2::req_perform() |> httr2::resp_body_string() |> jsonlite::fromJSON() - # Return a data frame - if (is.null(countOnly)){ - df <- df$items |> - dplyr::select(comid, dplyr::everything()) - return(df) - } else return(df$items) + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) + # Return a data frame if success + if (exists("df") && !is.null(df)){ + # Return a data frame + if (is.null(countOnly)){ + df <- df$items |> + dplyr::select(comid, dplyr::everything()) + return(df) + } else return(df$items) + if (is.null(countOnly)){ + df <- df$items |> + dplyr::select(comid, dplyr::everything()) + return(df) + } else return(df$items) + } } diff --git a/R/lc_get_params.R b/R/lc_get_params.R index 8fd05f8..22a3e1e 100644 --- a/R/lc_get_params.R +++ b/R/lc_get_params.R @@ -32,59 +32,62 @@ lc_get_params <- function(param = NULL) { WEBTOOL_NAME <- METRIC_UNITS <- METRIC_DESCRIPTION <- DSID <- NULL SOURCE_NAME <- SOURCE_URL <- UUID <- DATE_DOWNLOADED <- NULL DSNAME <- NULL - resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/lakes/metrics")$items - if (param=='aoi'){ - params <- strsplit(stringr::str_sub(resp$aoi_param_info[[1]]$options,2,-2),",")[[1]] - params <- c(gsub(" ","", params),'other') - params <- params[order(params)] - params <- params[!params %in% c('catrp100','wsrp100','other')] - } else if(param == 'metric_names') { - params <- resp$name_options[[1]][[1]] - params <- params[!duplicated(params)] - params <- params[order(params)] - } else if(param == 'variable_info') { - params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> - httr2::req_perform() |> - httr2::resp_body_string() |> - readr::read_csv(show_col_types = FALSE) |> - dplyr::select(-UUID,-DATE_DOWNLOADED,-METADATA) |> - dplyr::rename(dataset=FINAL_TABLE,category=INDICATOR_CATEGORY, - metric=METRIC_NAME,aoi=AOI, year=YEAR, - short_description=WEBTOOL_NAME,units=METRIC_UNITS, - long_description=METRIC_DESCRIPTION, dsid=DSID, - source_name=SOURCE_NAME, source_URL=SOURCE_URL) - } else if(param == 'categories'){ - params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> - httr2::req_perform() |> - httr2::resp_body_string() |> - readr::read_csv(show_col_types = FALSE) |> - dplyr::select(INDICATOR_CATEGORY) - params <- sort(unique(params$INDICATOR_CATEGORY)) - } else if(param == 'datasets'){ - params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> - httr2::req_perform() |> - httr2::resp_body_string() |> - readr::read_csv(show_col_types = FALSE) |> - dplyr::select(DSNAME) - params <- sort(unique(params$DSNAME[!is.na(params$DSNAME)])) - } else if(param == 'region'){ - params <- resp$region_options[[1]][[1]] - params <- params[order(params)] - } else if(param == 'state'){ - params <- resp$state_options[[1]] - params <- params[!params$st_abbr %in% c('AK','HI','PR'),] - params$st_fips <- as.character(params$st_fips) - params$st_fips[nchar(params$st_fips) < 2] <- paste0('0',params$st_fips[nchar(params$st_fips) < 2]) - params <- params[order(params$st_name),] - rownames(params) <- 1:nrow(params) - } else if(param == 'county'){ - params <- resp$county_options[[1]] - params$fips <- as.character(params$fips) - params$fips[nchar(params$fips) < 5] <- paste0('0',params$fips[nchar(params$fips) < 5]) - params <- params[with(params,order(state,county_name)),] - rownames(params) <- 1:nrow(params) - } - return(params) + result <- tryCatch({ + resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/lakes/metrics")$items + if (param=='aoi'){ + params <- strsplit(stringr::str_sub(resp$aoi_param_info[[1]]$options,2,-2),",")[[1]] + params <- c(gsub(" ","", params),'other') + params <- params[order(params)] + params <- params[!params %in% c('catrp100','wsrp100','other')] + } else if(param == 'metric_names') { + params <- resp$name_options[[1]][[1]] + params <- params[!duplicated(params)] + params <- params[order(params)] + } else if(param == 'variable_info') { + params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> + httr2::req_perform() |> + httr2::resp_body_string() |> + readr::read_csv(show_col_types = FALSE) |> + dplyr::select(-UUID,-DATE_DOWNLOADED,-METADATA) |> + dplyr::rename(dataset=FINAL_TABLE,category=INDICATOR_CATEGORY, + metric=METRIC_NAME,aoi=AOI, year=YEAR, + short_description=WEBTOOL_NAME,units=METRIC_UNITS, + long_description=METRIC_DESCRIPTION, dsid=DSID, + source_name=SOURCE_NAME, source_URL=SOURCE_URL) + } else if(param == 'categories'){ + params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> + httr2::req_perform() |> + httr2::resp_body_string() |> + readr::read_csv(show_col_types = FALSE) |> + dplyr::select(INDICATOR_CATEGORY) + params <- sort(unique(params$INDICATOR_CATEGORY)) + } else if(param == 'datasets'){ + params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> + httr2::req_perform() |> + httr2::resp_body_string() |> + readr::read_csv(show_col_types = FALSE) |> + dplyr::select(DSNAME) + params <- sort(unique(params$DSNAME[!is.na(params$DSNAME)])) + } else if(param == 'region'){ + params <- resp$region_options[[1]][[1]] + params <- params[order(params)] + } else if(param == 'state'){ + params <- resp$state_options[[1]] + params <- params[!params$st_abbr %in% c('AK','HI','PR'),] + params$st_fips <- as.character(params$st_fips) + params$st_fips[nchar(params$st_fips) < 2] <- paste0('0',params$st_fips[nchar(params$st_fips) < 2]) + params <- params[order(params$st_name),] + } else if(param == 'county'){ + params <- resp$county_options[[1]] + params$fips <- as.character(params$fips) + params$fips[nchar(params$fips) < 5] <- paste0('0',params$fips[nchar(params$fips) < 5]) + params <- params[with(params,order(state,county_name)),] + } + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) + return(result) } #' @title Lookup Full Metric Name @@ -106,8 +109,13 @@ lc_get_params <- function(param = NULL) { #' fullname <- lc_fullname(metric='clay') lc_fullname <- function(metric = NULL) { - resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/lakes/datadictionary")$items - result <- unique(resp$short_display_name[resp$metric_prefix %in% metric]) + result <- tryCatch({ + resp <-jsonlite::fromJSON("https://api.epa.gov/StreamCat/lakes/datadictionary")$items + resp <- unique(resp$short_display_name[resp$metric_prefix %in% metric]) + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) return(result) } @@ -134,7 +142,7 @@ lc_fullname <- function(metric = NULL) { #' \dontrun{ #' metrics <- lc_get_metric_names(category='Natural') #' metrics <- lc_get_metric_names(category = c('Anthropogenic','Natural'), -#' aoi=c('Cat','Ws')} +#' aoi=c('Cat','Ws'))} lc_get_metric_names <- function(category = NULL, @@ -156,10 +164,15 @@ lc_get_metric_names <- function(category = NULL, } aoi <- stringr::str_to_title(aoi) } - resp <- params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> + resp <- tryCatch({ + params <- httr2::request('https://api.epa.gov/StreamCat/lakes/variable_info') |> httr2::req_perform() |> httr2::resp_body_string() |> readr::read_csv(show_col_types = FALSE) + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) filters <- list(INDICATOR_CATEGORY = category, AOI = aoi, YEAR = year, DSNAME = dataset) @@ -173,7 +186,7 @@ lc_get_metric_names <- function(category = NULL, .f = function(df, col_name) { filter_values <- filters[[col_name]] if (!is.null(filter_values)) { - temp_col <- stringr::str_split(df[[col_name]], ",") + temp_col <- stringr::str_split(df[[col_name]], ", ") df <- df[purrr::map_lgl(temp_col, ~ any(.x %in% filter_values)), , drop = FALSE] } df diff --git a/R/sc_get_data.R b/R/sc_get_data.R index 51a83f1..906be8f 100644 --- a/R/sc_get_data.R +++ b/R/sc_get_data.R @@ -153,7 +153,8 @@ sc_get_data <- function(comid = NULL, state=state,county=county,region=region,conus=conus, countOnly=countOnly ) - df <- req |> + df <- tryCatch({ + req |> httr2::req_method("POST") |> httr2::req_headers("Content-Type" = "application/x-www-form-urlencoded") |> httr2::req_method("POST") |> @@ -163,12 +164,24 @@ sc_get_data <- function(comid = NULL, httr2::req_perform() |> httr2::resp_body_string() |> jsonlite::fromJSON() + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) + # Return a data frame if success + if (exists("df") && !is.null(df)){ # Return a data frame + if (is.null(countOnly)){ + df <- df$items |> + dplyr::select(comid, dplyr::everything()) + return(df) + } else return(df$items) if (is.null(countOnly)){ df <- df$items |> dplyr::select(comid, dplyr::everything()) return(df) } else return(df$items) + } } diff --git a/R/sc_get_params.R b/R/sc_get_params.R index 4d024fa..2941822 100644 --- a/R/sc_get_params.R +++ b/R/sc_get_params.R @@ -31,59 +31,61 @@ sc_get_params <- function(param = NULL) { WEBTOOL_NAME <- METRIC_UNITS <- METRIC_DESCRIPTION <- DSID <- NULL SOURCE_NAME <- SOURCE_URL <- UUID <- DATE_DOWNLOADED <- NULL DSNAME <- NULL - resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/streams/metrics")$items - if (param=='aoi'){ - params <- strsplit(stringr::str_sub(resp$aoi_param_info[[1]]$options,2,-2),",")[[1]] - params <- c(gsub(" ","", params),'other') - params <- params[order(params)] - } else if(param == 'metric_names') { - params <- resp$name_options[[1]][[1]] - params <- params[!duplicated(params)] - params <- params[order(params)] - } else if(param == 'variable_info') { - params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> - httr2::req_perform() |> - httr2::resp_body_string() |> - readr::read_csv(show_col_types = FALSE) |> - dplyr::select(-UUID,-DATE_DOWNLOADED,-METADATA) |> - dplyr::rename(dataset=FINAL_TABLE,category=INDICATOR_CATEGORY, - metric=METRIC_NAME,aoi=AOI, year=YEAR, - short_description=WEBTOOL_NAME,units=METRIC_UNITS, - long_description=METRIC_DESCRIPTION, dsid=DSID, - source_name=SOURCE_NAME, source_URL=SOURCE_URL) - } else if(param == 'categories'){ - params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> - httr2::req_perform() |> - httr2::resp_body_string() |> - readr::read_csv(show_col_types = FALSE) |> - dplyr::select(INDICATOR_CATEGORY) - params <- sort(unique(params$INDICATOR_CATEGORY)) - } else if(param == 'datasets'){ - params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> - httr2::req_perform() |> - httr2::resp_body_string() |> - readr::read_csv(show_col_types = FALSE) |> - dplyr::select(DSNAME) - params <- sort(unique(params$DSNAME[!is.na(params$DSNAME)])) - } - else if(param == 'region'){ - params <- resp$region_options[[1]][[1]] - params <- params[order(params)] - } else if(param == 'state'){ - params <- resp$state_options[[1]] - params <- params[!params$st_abbr %in% c('AK','HI','PR'),] - params$st_fips <- as.character(params$st_fips) - params$st_fips[nchar(params$st_fips) < 2] <- paste0('0',params$st_fips[nchar(params$st_fips) < 2]) - params <- params[order(params$st_name),] - rownames(params) <- 1:nrow(params) - } else if(param == 'county'){ - params <- resp$county_options[[1]] - params$fips <- as.character(params$fips) - params$fips[nchar(params$fips) < 5] <- paste0('0',params$fips[nchar(params$fips) < 5]) - params <- params[with(params,order(state,county_name)),] - rownames(params) <- 1:nrow(params) - } - return(params) + result <- tryCatch({ + resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/streams/metrics")$items + if (param=='aoi'){ + params <- strsplit(stringr::str_sub(resp$aoi_param_info[[1]]$options,2,-2),",")[[1]] + params <- c(gsub(" ","", params),'other') + params <- params[order(params)] + } else if(param == 'metric_names') { + params <- resp$name_options[[1]][[1]] + params <- params[!duplicated(params)] + params <- params[order(params)] + } else if(param == 'variable_info') { + params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> + httr2::req_perform() |> + httr2::resp_body_string() |> + readr::read_csv(show_col_types = FALSE) |> + dplyr::select(-UUID,-DATE_DOWNLOADED,-METADATA) |> + dplyr::rename(dataset=FINAL_TABLE,category=INDICATOR_CATEGORY, + metric=METRIC_NAME,aoi=AOI, year=YEAR, + short_description=WEBTOOL_NAME,units=METRIC_UNITS, + long_description=METRIC_DESCRIPTION, dsid=DSID, + source_name=SOURCE_NAME, source_URL=SOURCE_URL) + } else if(param == 'categories'){ + params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> + httr2::req_perform() |> + httr2::resp_body_string() |> + readr::read_csv(show_col_types = FALSE) |> + dplyr::select(INDICATOR_CATEGORY) + params <- sort(unique(params$INDICATOR_CATEGORY)) + } else if(param == 'datasets'){ + params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> + httr2::req_perform() |> + httr2::resp_body_string() |> + readr::read_csv(show_col_types = FALSE) |> + dplyr::select(DSNAME) + params <- sort(unique(params$DSNAME[!is.na(params$DSNAME)])) + } else if(param == 'region'){ + params <- resp$region_options[[1]][[1]] + params <- params[order(params)] + } else if(param == 'state'){ + params <- resp$state_options[[1]] + params <- params[!params$st_abbr %in% c('AK','HI','PR'),] + params$st_fips <- as.character(params$st_fips) + params$st_fips[nchar(params$st_fips) < 2] <- paste0('0',params$st_fips[nchar(params$st_fips) < 2]) + params <- params[order(params$st_name),] + } else if(param == 'county'){ + params <- resp$county_options[[1]] + params$fips <- as.character(params$fips) + params$fips[nchar(params$fips) < 5] <- paste0('0',params$fips[nchar(params$fips) < 5]) + params <- params[with(params,order(state,county_name)),] + } + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) + return(result) } #' @title Lookup Full Metric Name @@ -105,8 +107,13 @@ sc_get_params <- function(param = NULL) { #' fullname <- sc_fullname(metric='clay') sc_fullname <- function(metric = NULL) { - resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/streams/datadictionary")$items - result <- unique(resp$short_display_name[resp$metric_prefix %in% metric]) + result <- tryCatch({ + resp <- jsonlite::fromJSON("https://api.epa.gov/StreamCat/streams/datadictionary")$items + resp <- unique(resp$short_display_name[resp$metric_prefix %in% metric]) + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) return(result) } @@ -134,7 +141,7 @@ sc_fullname <- function(metric = NULL) { #' \dontrun{ #' metrics <- sc_get_metric_names(category='Wildfire') #' metrics <- sc_get_metric_names(category = c('Deposition','Climate'), -#' aoi=c('Cat','Ws') +#' aoi=c('Cat','Ws')) #' metrics <- sc_get_metric_names(aoi='Other', #' dataset=c('Canal Density','Predicted Channel Widths Depths')) #' @@ -160,10 +167,15 @@ sc_get_metric_names <- function(category = NULL, } aoi <- stringr::str_to_title(aoi) } - resp <- params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> + resp <- tryCatch({ + params <- httr2::request('https://api.epa.gov/StreamCat/streams/variable_info') |> httr2::req_perform() |> httr2::resp_body_string() |> readr::read_csv(show_col_types = FALSE) + },error = function(e) { + message("An error occurred during req_perform(); the service may be down or function parameters may be mis-specified: ", e$message) + return(NULL) + }) filters <- list(INDICATOR_CATEGORY = category, AOI = aoi, YEAR = year, DSNAME = dataset) @@ -176,7 +188,8 @@ sc_get_metric_names <- function(category = NULL, .f = function(df, col_name) { filter_values <- filters[[col_name]] if (!is.null(filter_values)) { - temp_col <- stringr::str_split(df[[col_name]], ",") + # Split the column values by comma + temp_col <- stringr::str_split(df[[col_name]], ", ") df <- df[purrr::map_lgl(temp_col, ~ any(.x %in% filter_values)), , drop = FALSE] } df diff --git a/cran-comments.md b/cran-comments.md index f8d18b2..499faf5 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,8 +1,10 @@ -This is a minor update that +This is a minor update that: -- Adds code covereage to the package -- Adds two new functions to the package -- Allows passing of vectors as parameters to two of the package functions +- Addresses CRAN error noted by Dr. Brian Ripley generated by tests that is + required to be fixed by 10/25/25 +- Adds tryCatch handling for functions calling web services in order to fail + gracefully and not produce errors +- Adds documentation to vignettes for two new functions added to the package ------- diff --git a/man/lc_get_metric_names.Rd b/man/lc_get_metric_names.Rd index 523ee82..edaeb8f 100644 --- a/man/lc_get_metric_names.Rd +++ b/man/lc_get_metric_names.Rd @@ -27,7 +27,7 @@ to see all the valid category or dataset options \dontrun{ metrics <- lc_get_metric_names(category='Natural') metrics <- lc_get_metric_names(category = c('Anthropogenic','Natural'), -aoi=c('Cat','Ws')} +aoi=c('Cat','Ws'))} } \author{ Marc Weber diff --git a/man/sc_get_metric_names.Rd b/man/sc_get_metric_names.Rd index 1f11eb1..89c5791 100644 --- a/man/sc_get_metric_names.Rd +++ b/man/sc_get_metric_names.Rd @@ -27,7 +27,7 @@ to see all the valid category or dataset options \dontrun{ metrics <- sc_get_metric_names(category='Wildfire') metrics <- sc_get_metric_names(category = c('Deposition','Climate'), -aoi=c('Cat','Ws') +aoi=c('Cat','Ws')) metrics <- sc_get_metric_names(aoi='Other', dataset=c('Canal Density','Predicted Channel Widths Depths')) diff --git a/tests/testthat/test-lc_get_params.R b/tests/testthat/test-lc_get_params.R index 47d62d5..55eccc6 100644 --- a/tests/testthat/test-lc_get_params.R +++ b/tests/testthat/test-lc_get_params.R @@ -15,7 +15,7 @@ test_that("lc_get_params for variable_info parameters", { test_that("lc_get_metric_names", { metrics <- lc_get_metric_names(category='Natural') expect_true(exists("metrics")) - expect_gt(nrow(metrics),70) + expect_gt(nrow(metrics),20) expect_equal(names(metrics), c("Category","Metric","AOI","Year", "Short_Name","Metric_Description","Units", "Source","Dataset")) diff --git a/vignettes/Introduction.Rmd b/vignettes/Introduction.Rmd index 37922a3..42ce618 100644 --- a/vignettes/Introduction.Rmd +++ b/vignettes/Introduction.Rmd @@ -76,6 +76,7 @@ metric='pctdecid2019,fert' fullname <- sc_fullname(metric) fullname ``` + We can additionally get a data frame of state FIPS codes, abbreviations and names, and the same information for counties as well using `sc_get_params`: ```{r states} states <- sc_get_params(param='state') @@ -87,6 +88,13 @@ counties <- sc_get_params(param='county') head(counties) ``` +## Filter metric information by criteria +We can also filter metric names and information by the metric year(s), the indicator categories for metrics, the metric data set names, or the Areas of Interest the metrics are available for. +```{r get_metric_names} +metrics <- sc_get_metric_names(category = c('Deposition','Climate'),aoi=c('Cat','Ws')) +head(metrics) +``` + ## Get data for COMIDs In this example we access several variables, for several areas of interest, and for several COMIDs using the `sc_get_data` function. Loads data into a tibble we can view. ```{r get_data} diff --git a/vignettes/LakeCat.Rmd b/vignettes/LakeCat.Rmd index 166e829..5894270 100644 --- a/vignettes/LakeCat.Rmd +++ b/vignettes/LakeCat.Rmd @@ -68,6 +68,13 @@ fullname <- lc_fullname(metric) fullname ``` +## Filter metric information by criteria +We can also filter metric names and information by the metric year(s), the indicator categories for metrics, the metric data set names, or the Areas of Interest the metrics are available for. +```{r get_metric_names} +metrics <- lc_get_metric_names(category = c('Anthropogenic','Natural'), aoi=c('Cat','Ws')) +head(metrics) +``` + ## Get Waterbody COMIDs In this example we use the `lc_get_comid` function to find COMIDs for a set of example lake locations we load into R.`lc_get_comid` is just a simple wrapper for `get_waterbodies` in the [nhdplusTools](https://doi-usgs.github.io/nhdplusTools/) R package. We can then use the COMIDs we derive for our lake locations to get LakeCat metrics for these lakes as we show in after this. ```{r comids, warning=FALSE, message=FALSE}