From 272672d5a5e1d9e1fb0e00b638df14acde4f7a35 Mon Sep 17 00:00:00 2001 From: Diego H Date: Sat, 27 Jan 2024 22:34:27 +0100 Subject: [PATCH] Add tests and more parameters to scales --- NAMESPACE | 1 - NEWS.md | 7 +- R/bde_check_access.R | 1 - R/catalogs.R | 364 ++++++++---------- R/scales.R | 36 +- R/series.R | 22 +- R/theme_tidybde.R | 2 +- R/tidyBdE-package.R | 1 - README.Rmd | 10 +- README.md | 17 +- codemeta.json | 2 +- inst/WORDLIST | 2 +- man/bde_catalog_load.Rd | 2 +- man/bde_catalog_search.Rd | 16 +- man/bde_series_full_load.Rd | 4 +- man/bde_series_load.Rd | 2 +- man/figures/README-palettes-1.png | Bin 21823 -> 0 bytes man/figures/README-palettes-2.png | Bin 22086 -> 0 bytes man/scales_bde.Rd | 36 +- man/theme_tidybde.Rd | 2 +- tests/testthat.R | 8 + .../{bde_col_pal.md => bde_palettes.md} | 0 tests/testthat/test-deprecated.R | 4 +- tests/testthat/test-scales.R | 48 ++- .../articles/Main_Macroeconomic_Series.Rmd | 2 +- vignettes/chart-1.png | Bin 0 -> 26556 bytes vignettes/tidyBdE.Rmd | 10 +- vignettes/tidyBdE.Rmd.orig | 11 +- 28 files changed, 309 insertions(+), 301 deletions(-) delete mode 100644 man/figures/README-palettes-1.png delete mode 100644 man/figures/README-palettes-2.png rename tests/testthat/_snaps/{bde_col_pal.md => bde_palettes.md} (100%) create mode 100644 vignettes/chart-1.png diff --git a/NAMESPACE b/NAMESPACE index 07e1b10b..49e076c7 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -36,6 +36,5 @@ importFrom(ggplot2,margin) importFrom(ggplot2,rel) importFrom(ggplot2,unit) importFrom(lifecycle,deprecated) -importFrom(tibble,tibble) importFrom(utils,download.file) importFrom(utils,read.csv2) diff --git a/NEWS.md b/NEWS.md index f419022a..d5061f58 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,12 @@ # tidyBdE (development version) +Mostly changes on the color functions: + - `bde_vivid_pal()` and `bde_rose_pal()` have been deprecated. Use the new -function `bde_palettes()` instead. + function `bde_palettes()` instead. +- `scale_color_bde_d()` and friends leverage now on `bde_palettes()`, and + these functions gain two new arguments: `alpha` y `rev`. +- Update and review documentation. # tidyBdE 0.3.4 diff --git a/R/bde_check_access.R b/R/bde_check_access.R index 865718f8..b1c3592c 100644 --- a/R/bde_check_access.R +++ b/R/bde_check_access.R @@ -1,6 +1,5 @@ #' Check access to BdE #' -#' #' @description #' Check if R has access to resources at #' . diff --git a/R/catalogs.R b/R/catalogs.R index cb07583a..a57c09f6 100644 --- a/R/catalogs.R +++ b/R/catalogs.R @@ -1,14 +1,15 @@ #' Load BdE catalogs #' +#' @description #' Load the time-series catalogs provided by BdE. +#' #' @export #' #' @family catalog #' #' @encoding UTF-8 #' -#' @return A `tibble`. -#' +#' @return A [tibble][tibble::tibble]. #' #' @source #' [Time-series bulk data @@ -25,7 +26,6 @@ #' #' @inheritParams bde_catalog_update #' -#' #' @details #' Accepted values for `catalog` are: #' @@ -45,10 +45,7 @@ #' "**") #' #' knitr::kable(t) -#' -#' #' ``` -#' #' Use `"ALL"` as a shorthand for updating all the catalogs at a glance. #' #' If the requested catalog is not cached [bde_catalog_update()] is invoked. @@ -57,148 +54,135 @@ #' \donttest{ #' bde_catalog_load("TI", verbose = TRUE) #' } -bde_catalog_load <- - function(catalog = c("ALL", "BE", "SI", "TC", "TI", "PB"), - parse_dates = TRUE, - cache_dir = NULL, - update_cache = FALSE, - verbose = FALSE) { - catalog <- match.arg(catalog) - # Validate - valid_catalogs <- - c("BE", "SI", "TC", "TI", "PB", "ALL") - stopifnot( - catalog %in% valid_catalogs, - length(catalog) == 1, - is.null(cache_dir) || is.character(cache_dir), - is.logical(verbose), - is.logical(parse_dates), - is.logical(update_cache) - ) - - if (catalog == "ALL") { - catalog_to_load <- setdiff(valid_catalogs, "ALL") +bde_catalog_load <- function(catalog = c("ALL", "BE", "SI", "TC", "TI", "PB"), + parse_dates = TRUE, cache_dir = NULL, + update_cache = FALSE, verbose = FALSE) { + catalog <- match.arg(catalog) + # Validate + valid_catalogs <- c("BE", "SI", "TC", "TI", "PB", "ALL") + stopifnot( + catalog %in% valid_catalogs, length(catalog) == 1, + any(is.null(cache_dir), is.character(cache_dir)), + is.logical(verbose), is.logical(parse_dates), + is.logical(update_cache) + ) + + + catalog_to_load <- catalog + if (catalog == "ALL") catalog_to_load <- setdiff(valid_catalogs, "ALL") + + # Get cache dir + cache_dir <- bde_hlp_cachedir(cache_dir = cache_dir, verbose = verbose) + + final_catalog <- lapply(catalog_to_load, function(x) { + catalog_file <- paste0("catalogo_", tolower(x), ".csv") + catalog_file <- file.path(cache_dir, catalog_file) + has_cache <- file.exists(catalog_file) + + if (all(has_cache, isFALSE(update_cache))) { + if (verbose) message("tidyBdE> Cached version of ", x, " detected") } else { - catalog_to_load <- catalog - } + # If no catalog is found or requested, update + if (verbose) message("tidyBdE> Need to download catalog ", x) + + result <- bde_catalog_update( + catalog = x, cache_dir = cache_dir, + verbose = verbose + ) - # Get cache dir - cache_dir <- - bde_hlp_cachedir(cache_dir = cache_dir, verbose = verbose) - - final_catalog <- lapply(catalog_to_load, function(x) { - catalog_file <- paste0("catalogo_", tolower(x), ".csv") - catalog_file <- file.path(cache_dir, catalog_file) - has_cache <- file.exists(catalog_file) - - if (all(has_cache, isFALSE(update_cache))) { - if (verbose) message("tidyBdE> Cached version of ", x, " detected") - } else { - # If no catalog is found or requested, update - if (verbose) message("tidyBdE> Need to download catalog ", x) - - result <- bde_catalog_update( - catalog = x, - cache_dir = cache_dir, - verbose = verbose - ) - - # On error return NULL - if (is.data.frame(result) || isFALSE(result)) { - message("Download not available for ", x) - return(NULL) - } + # On error return NULL + if (any(is.data.frame(result), isFALSE(result))) { + message("Download not available for ", x) + return(NULL) } + } - # Catch error - # nocov start - r <- readLines(catalog_file) - if (length(r) == 0) { - message("File ", catalog_file, " not valid") - return(invisible()) - } - # nocov end - - catalog_load <- - read.csv2( - catalog_file, - sep = ",", - stringsAsFactors = FALSE, - na.strings = "", - header = FALSE - ) - - # Convert names - # Hard-coded, problematic on checks because UTF-8 values - # Some OS would fail if this workaround is not used - names_catalog <- c( - "Nombre_de_la_serie", - "Numero_secuencial", - "Alias_de_la_serie", - "Nombre_del_archivo_con_los_valores_de_la_serie", - "Descripcion_de_la_serie", - "Tipo_de_variable", - "Codigo_de_unidades", - "Exponente", - "Numero_de_decimales", - "Descripcion_de_unidades_y_exponente", - "Frecuencia_de_la_serie", - "Fecha_de_la_primera_observacion", - "Fecha_de_la_ultima_observacion", - "Numero_de_observaciones", - "Titulo_de_la_serie", - "Fuente", - "Notas" - ) + # Catch error + # nocov start + r <- readLines(catalog_file) + if (length(r) == 0) { + message("File ", catalog_file, " not valid") + return(invisible()) + } + # nocov end - # Rename and delete first row - names(catalog_load) <- names_catalog - catalog_load <- catalog_load[-1, ] + catalog_load <- read.csv2(catalog_file, + sep = ",", + stringsAsFactors = FALSE, na.strings = "", + header = FALSE + ) - catalog_load <- bde_hlp_tochar(catalog_load) - return(catalog_load) - }) + # Convert names + # Hard-coded, problematic on checks because UTF-8 values + # Some OS would fail if this workaround is not used + names_catalog <- c( + "Nombre_de_la_serie", + "Numero_secuencial", + "Alias_de_la_serie", + "Nombre_del_archivo_con_los_valores_de_la_serie", + "Descripcion_de_la_serie", + "Tipo_de_variable", + "Codigo_de_unidades", + "Exponente", + "Numero_de_decimales", + "Descripcion_de_unidades_y_exponente", + "Frecuencia_de_la_serie", + "Fecha_de_la_primera_observacion", + "Fecha_de_la_ultima_observacion", + "Numero_de_observaciones", + "Titulo_de_la_serie", + "Fuente", + "Notas" + ) - res_all <- unlist(lapply(final_catalog, is.null)) + # Rename and delete first row + names(catalog_load) <- names_catalog + catalog_load <- catalog_load[-1, ] - if (any(res_all)) { - msg <- paste0(catalog_to_load[res_all], collapse = ", ") - message("tidyBdE> Could not load catalogs: ", msg) - } + catalog_load <- bde_hlp_tochar(catalog_load) + return(catalog_load) + }) - # Guess formats + res_all <- unlist(lapply(final_catalog, is.null)) - # Unlist - final_catalog <- dplyr::bind_rows(final_catalog) - final_catalog <- - bde_hlp_guess(final_catalog, preserve = names(final_catalog)[c(5, 15)]) + if (any(res_all)) { + msg <- paste0(catalog_to_load[res_all], collapse = ", ") + message("tidyBdE> Could not load catalogs: ", msg) + } + # Guess formats - # To tibble - final_catalog <- tibble::as_tibble(final_catalog) + # Unlist + final_catalog <- dplyr::bind_rows(final_catalog) + final_catalog <- bde_hlp_guess(final_catalog, + preserve = names(final_catalog)[c(5, 15)] + ) - # Parse dates dates - if (parse_dates) { - if (verbose) { - message("tidyBdE> Parsing dates") - } - date_fields <- - names(final_catalog)[grep("Fecha", names(final_catalog))] + # To tibble + final_catalog <- tibble::as_tibble(final_catalog) - for (i in seq_len(length(date_fields))) { - field <- date_fields[i] - final_catalog[field] <- - bde_parse_dates(final_catalog[[field]]) - } + + # Parse dates dates + if (parse_dates) { + if (verbose) { + message("tidyBdE> Parsing dates") + } + date_fields <- names(final_catalog)[grep("Fecha", names(final_catalog))] + + for (i in seq_len(length(date_fields))) { + field <- date_fields[i] + final_catalog[field] <- bde_parse_dates(final_catalog[[field]]) } - return(final_catalog) } + return(final_catalog) +} #' Update BdE catalogs #' +#' @description #' Update the time-series catalogs provided by BdE. #' #' @export @@ -215,7 +199,6 @@ bde_catalog_load <- #' #' @param catalog A vector of characters indicating the catalogs to be updated #' or `"ALL"` as a shorthand. See **Details**. -#' #' @param cache_dir A path to a cache directory. The directory can also be set #' via options with `options(bde_cache_dir = "path/to/dir")`. #' @param verbose Logical `TRUE` or `FALSE`, display information useful for @@ -242,104 +225,101 @@ bde_catalog_load <- #' knitr::kable(t) #' #' ``` -#' #' Use `"ALL"` as a shorthand for updating all the catalogs at a glance. #' #' @examplesIf bde_check_access() #' \donttest{ #' bde_catalog_update("TI", verbose = TRUE) #' } -bde_catalog_update <- - function(catalog = c("ALL", "BE", "SI", "TC", "TI", "PB"), - cache_dir = NULL, - verbose = FALSE) { - catalog <- match.arg(catalog) - # Validate - valid_catalogs <- - c("BE", "SI", "TC", "TI", "PB", "ALL") - stopifnot( - catalog %in% valid_catalogs, - is.null(cache_dir) || is.character(cache_dir), - is.logical(verbose) - ) +bde_catalog_update <- function(catalog = c("ALL", "BE", "SI", "TC", "TI", "PB"), + cache_dir = NULL, verbose = FALSE) { + catalog <- match.arg(catalog) + # Validate + valid_catalogs <- c("BE", "SI", "TC", "TI", "PB", "ALL") + stopifnot( + catalog %in% valid_catalogs, + any(is.null(cache_dir), is.character(cache_dir)), + is.logical(verbose) + ) - # nocov start - if (!bde_check_access()) { - tbl <- bde_hlp_return_null() - return(tbl) - } - # nocov end + # nocov start + if (!bde_check_access()) { + tbl <- bde_hlp_return_null() + return(tbl) + } + # nocov end - # Get cache dir - cache_dir <- - bde_hlp_cachedir(cache_dir = cache_dir, verbose = verbose) + # Get cache dir + cache_dir <- bde_hlp_cachedir(cache_dir = cache_dir, verbose = verbose) - # Loop and download - if ("ALL" %in% catalog) { - catalog_download <- valid_catalogs[valid_catalogs != "ALL"] - } else { - catalog_download <- catalog - } - if (verbose) { - message( - "tidyBdE> Updating catalogs: ", - paste0(catalog_download, collapse = ", ") - ) - } - res <- lapply(catalog_download, function(x) { - serie <- x - base_url <- paste0( - "https://www.bde.es/webbe/es/estadisticas/", - "compartido/datos/csv/" - ) - catalog_file <- paste0("catalogo_", tolower(serie), ".csv") + # Loop and download + catalog_download <- catalog + if ("ALL" %in% catalog) { + catalog_download <- valid_catalogs[valid_catalogs != "ALL"] + } - full_url <- paste0(base_url, catalog_file) - local_file <- file.path(cache_dir, catalog_file) + if (verbose) { + message( + "tidyBdE> Updating catalogs: ", + paste0(catalog_download, collapse = ", ") + ) + } - # Download - result <- bde_hlp_download( - url = full_url, - local_file = local_file, - verbose = verbose - ) - return(result) - }) + res <- lapply(catalog_download, function(x) { + serie <- x + base_url <- paste0( + "https://www.bde.es/webbe/es/estadisticas/", + "compartido/datos/csv/" + ) + catalog_file <- paste0("catalogo_", tolower(serie), ".csv") - return(invisible(res)) - } + full_url <- paste0(base_url, catalog_file) + local_file <- file.path(cache_dir, catalog_file) + + # Download + result <- bde_hlp_download( + url = full_url, + local_file = local_file, + verbose = verbose + ) + return(result) + }) + + return(invisible(res)) +} #' Search BdE catalogs #' +#' @description #' Search for keywords on the time-series catalogs. #' #' @export #' #' @family catalog #' -#' @return A tibble with the results of the query. +#' @return A [tibble][tibble::tibble] with the results of the query. #' -#' @param pattern [`regex`][base::grep()] pattern to search See -#' **Details** and **Examples**. +#' @param pattern [`regex`][base::regex] pattern to search See **Details** +#' and **Examples**. #' #' @inheritDotParams bde_catalog_load #' #' @encoding UTF-8 #' #' @details -#' **Note that** BdE files are only provided in -#' Spanish, for the time being. Therefore search terms should be provided -#' in Spanish as well in order to get search results. +#' **Note that** BdE files are only provided in Spanish, for the time being. +#' Therefore search terms should be provided in Spanish as well in order to get +#' search results. #' -#' This function uses [base::regex()] function for finding matches on -#' the catalogs. You can pass [regular expressions][base::regex()] to broaden +#' This function uses [base::grep()] function for finding matches on +#' the catalogs. You can pass [regular expressions][base::regex] to broaden #' the search. #' -#' @seealso [bde_catalog_load()], [base::regex()] +#' @seealso [bde_catalog_load()], [base::regex] #' #' @examplesIf bde_check_access() #' \donttest{ @@ -361,10 +341,6 @@ bde_catalog_update <- #' bde_catalog_search("^3779313$") #' } bde_catalog_search <- function(pattern, ...) { - if (missing(pattern) || is.null(pattern) || is.na(pattern)) { - stop("`pattern` should be a character.") - } - # Extract info catalog_search <- bde_catalog_load(...) diff --git a/R/scales.R b/R/scales.R index 7825f181..f515a7ff 100644 --- a/R/scales.R +++ b/R/scales.R @@ -20,6 +20,8 @@ #' @param palette Name of the BdE palette to apply. One of `"bde_vivid_pal"`, #' `"bde_rose_pal"`. See [bde_palettes()] for details. #' +#' @inheritParams bde_palettes +#' #' @param ... Further arguments of [ggplot2::discrete_scale()] or #' [ggplot2::continuous_scale()]. #' @@ -47,10 +49,10 @@ #' theme_minimal() #' scale_color_bde_d <- function(palette = c("bde_vivid_pal", "bde_rose_pal"), - ...) { + alpha = NULL, rev = FALSE, ...) { palette <- match.arg(palette) - cols_v <- bde_palettes(palette = palette) + cols_v <- bde_palettes(palette = palette, alpha = alpha, rev = rev) pal <- scales::manual_pal(cols_v) ggplot2::discrete_scale( @@ -71,10 +73,10 @@ scale_colour_bde_d <- scale_color_bde_d #' @name scales_bde #' @export scale_fill_bde_d <- function(palette = c("bde_vivid_pal", "bde_rose_pal"), - ...) { + alpha = NULL, rev = FALSE, ...) { palette <- match.arg(palette) - cols_v <- bde_palettes(palette = palette) + cols_v <- bde_palettes(palette = palette, alpha = alpha, rev = rev) pal <- scales::manual_pal(cols_v) ggplot2::discrete_scale( @@ -90,18 +92,25 @@ scale_fill_bde_d <- function(palette = c("bde_vivid_pal", "bde_rose_pal"), #' @name scales_bde #' @export scale_color_bde_c <- function(palette = c("bde_rose_pal", "bde_vivid_pal"), - ...) { + alpha = NULL, rev = FALSE, ...) { palette <- match.arg(palette) cols <- switch(palette, - "bde_vivid_pal" = bde_palettes(6, "bde_vivid_pal"), - "bde_rose_pal" = bde_palettes(6, "bde_rose_pal")[c(1, 2, 3, 6, 5, 4)] + "bde_vivid_pal" = bde_palettes(6, "bde_vivid_pal", + alpha = alpha, + rev = rev + ), + "bde_rose_pal" = bde_palettes(6, "bde_rose_pal", + alpha = alpha, + rev = rev + )[c(1, 2, 3, 6, 5, 4)] ) ggplot2::continuous_scale( aesthetics = "color", scale_name = palette, palette = scales::gradient_n_pal(cols), + guide = "colorbar", ... ) } @@ -116,18 +125,25 @@ scale_colour_bde_c <- scale_color_bde_c #' @name scales_bde #' @export scale_fill_bde_c <- function(palette = c("bde_rose_pal", "bde_vivid_pal"), - ...) { + alpha = NULL, rev = FALSE, ...) { palette <- match.arg(palette) cols <- switch(palette, - "bde_vivid_pal" = bde_palettes(6, "bde_vivid_pal"), - "bde_rose_pal" = bde_palettes(6, "bde_rose_pal")[c(1, 2, 3, 6, 5, 4)] + "bde_vivid_pal" = bde_palettes(6, "bde_vivid_pal", + alpha = alpha, + rev = rev + ), + "bde_rose_pal" = bde_palettes(6, "bde_rose_pal", + alpha = alpha, + rev = rev + )[c(1, 2, 3, 6, 5, 4)] ) ggplot2::continuous_scale( aesthetics = "fill", scale_name = palette, palette = scales::gradient_n_pal(cols), + guide = "colorbar", ... ) } diff --git a/R/series.R b/R/series.R index de3994ff..e45a27b5 100644 --- a/R/series.R +++ b/R/series.R @@ -24,7 +24,7 @@ #' #' #' @return -#' A `tibble` with a field "Date" and : +#' A [tibble][tibble::tibble] with a field "Date" and : #' - With `out_format = "wide"` each series is presented in a separate #' column with the name defined by `series_label`. #' - With `out_format = "long"` the tibble would have two more columns, @@ -98,14 +98,10 @@ #' scale_color_bde_d() + #' theme_tidybde() #' } -bde_series_load <- function(series_code, - series_label = NULL, - out_format = "wide", - parse_dates = TRUE, - parse_numeric = TRUE, - cache_dir = NULL, - update_cache = FALSE, - verbose = FALSE, +bde_series_load <- function(series_code, series_label = NULL, + out_format = "wide", parse_dates = TRUE, + parse_numeric = TRUE, cache_dir = NULL, + update_cache = FALSE, verbose = FALSE, extract_metadata = FALSE) { if (missing(series_code)) { stop("`series_code` can't be NULL") @@ -128,8 +124,6 @@ bde_series_load <- function(series_code, stop("`series_label` and `series_code` should have the same length") } - - # Lookup on catalogs all_catalogs <- bde_catalog_load( catalog = "ALL", parse_dates = parse_dates, @@ -190,8 +184,6 @@ bde_series_load <- function(series_code, tbl <- bde_hlp_return_null() return(tbl) } - # nocov end - # nocov start if (!(alias_serie %in% names(serie_file))) { if (verbose) { message( @@ -299,8 +291,8 @@ bde_series_load <- function(series_code, #' @param extract_metadata Logical `TRUE/FALSE`. On `TRUE` the output is the #' metadata of the requested series. #' -#' @return A tibble with a field "Date" and the alias of the fields series as -#' described on the catalogs. See [bde_catalog_load()]. +#' @return A [tibble][tibble::tibble] with a field "Date" and the alias of the +#' fields series as described on the catalogs. See [bde_catalog_load()]. #' #' @note #' This function tries to coerce the columns to numbers. For some series a diff --git a/R/theme_tidybde.R b/R/theme_tidybde.R index 3d4cd9bb..69516e88 100644 --- a/R/theme_tidybde.R +++ b/R/theme_tidybde.R @@ -38,7 +38,7 @@ #' names(series_TC_pivot) <- c("x", "y") #' #' ggplot(series_TC_pivot, aes(x = x, y = y)) + -#' geom_line(linewidth = 0.8, color = bde_vivid_pal()(1)) + +#' geom_line(linewidth = 0.8, color = bde_palettes(n = 1)) + #' labs( #' title = "Title", #' subtitle = "Some metric", diff --git a/R/tidyBdE-package.R b/R/tidyBdE-package.R index 107309cd..6214d855 100644 --- a/R/tidyBdE-package.R +++ b/R/tidyBdE-package.R @@ -10,6 +10,5 @@ NULL # import stuffs #' @importFrom utils download.file read.csv2 -#' @importFrom tibble tibble #' @importFrom ggplot2 unit element_rect element_text element_blank element_line NULL diff --git a/README.Rmd b/README.Rmd index 0dac939e..52cea94d 100644 --- a/README.Rmd +++ b/README.Rmd @@ -126,8 +126,8 @@ BdE: ```{r chart, fig.asp=0.7} ggplot(time_series, aes(x = Date, y = EUR_GBP_XR)) + - geom_line(colour = bde_vivid_pal()(1)) + - geom_smooth(method = "gam", colour = bde_vivid_pal()(2)[2]) + + geom_line(colour = bde_palettes(n = 1)) + + geom_smooth(method = "gam", colour = bde_palettes(n = 2)[2]) + labs( title = "EUR/GBP Exchange Rate (2010-2020)", subtitle = "%", @@ -176,12 +176,6 @@ ggplot(plotseries, aes(x = Date, y = serie_value)) + Two custom palettes, based on the used by BdE on some publications are available. -```{r palettes, fig.asp=0.7} -scales::show_col(bde_rose_pal()(6)) - -scales::show_col(bde_vivid_pal()(6)) -``` - Those palettes can be applied to a `ggplot2` using some custom utils included on the package (see `help("scale_color_bde_d", package = "tidyBdE")`). diff --git a/README.md b/README.md index fbe04d14..e58b0b65 100644 --- a/README.md +++ b/README.md @@ -116,8 +116,8 @@ publications of BdE: ``` r ggplot(time_series, aes(x = Date, y = EUR_GBP_XR)) + - geom_line(colour = bde_vivid_pal()(1)) + - geom_smooth(method = "gam", colour = bde_vivid_pal()(2)[2]) + + geom_line(colour = bde_palettes(n = 1)) + + geom_smooth(method = "gam", colour = bde_palettes(n = 2)[2]) + labs( title = "EUR/GBP Exchange Rate (2010-2020)", subtitle = "%", @@ -170,19 +170,6 @@ ggplot(plotseries, aes(x = Date, y = serie_value)) + Two custom palettes, based on the used by BdE on some publications are available. -``` r -scales::show_col(bde_rose_pal()(6)) -``` - - - -``` r - -scales::show_col(bde_vivid_pal()(6)) -``` - - - Those palettes can be applied to a `ggplot2` using some custom utils included on the package (see `help("scale_color_bde_d", package = "tidyBdE")`). diff --git a/codemeta.json b/codemeta.json index c4cfb1ae..09b61f38 100644 --- a/codemeta.json +++ b/codemeta.json @@ -192,7 +192,7 @@ }, "applicationCategory": "Macroeconomics", "isPartOf": "https://ropenspain.es/", - "fileSize": "290.036KB", + "fileSize": "273.699KB", "citation": [ { "@type": "SoftwareSourceCode", diff --git a/inst/WORDLIST b/inst/WORDLIST index 2868d0ef..edce3ce5 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -50,7 +50,7 @@ rOS rect secuencial serie +superseeded tibble -tidyBdE’ tidyr tidyverse diff --git a/man/bde_catalog_load.Rd b/man/bde_catalog_load.Rd index 3ab4132f..b631b083 100644 --- a/man/bde_catalog_load.Rd +++ b/man/bde_catalog_load.Rd @@ -33,7 +33,7 @@ the \code{cache_dir}.} debugging.} } \value{ -A \code{tibble}. +A \link[tibble:tibble]{tibble}. } \description{ Load the time-series catalogs provided by BdE. diff --git a/man/bde_catalog_search.Rd b/man/bde_catalog_search.Rd index 0cc0d915..aaa95c13 100644 --- a/man/bde_catalog_search.Rd +++ b/man/bde_catalog_search.Rd @@ -8,8 +8,8 @@ bde_catalog_search(pattern, ...) } \arguments{ -\item{pattern}{\code{\link[base:grep]{regex}} pattern to search See -\strong{Details} and \strong{Examples}.} +\item{pattern}{\code{\link[base:regex]{regex}} pattern to search See \strong{Details} +and \strong{Examples}.} \item{...}{ Arguments passed on to \code{\link[=bde_catalog_load]{bde_catalog_load}} @@ -27,17 +27,17 @@ debugging.} }} } \value{ -A tibble with the results of the query. +A \link[tibble:tibble]{tibble} with the results of the query. } \description{ Search for keywords on the time-series catalogs. } \details{ -\strong{Note that} BdE files are only provided in -Spanish, for the time being. Therefore search terms should be provided -in Spanish as well in order to get search results. +\strong{Note that} BdE files are only provided in Spanish, for the time being. +Therefore search terms should be provided in Spanish as well in order to get +search results. -This function uses \code{\link[base:regex]{base::regex()}} function for finding matches on +This function uses \code{\link[base:grep]{base::grep()}} function for finding matches on the catalogs. You can pass \link[base:regex]{regular expressions} to broaden the search. } @@ -64,7 +64,7 @@ bde_catalog_search("^3779313$") \dontshow{\}) # examplesIf} } \seealso{ -\code{\link[=bde_catalog_load]{bde_catalog_load()}}, \code{\link[base:regex]{base::regex()}} +\code{\link[=bde_catalog_load]{bde_catalog_load()}}, \link[base:regex]{base::regex} Other catalog: \code{\link{bde_catalog_load}()}, diff --git a/man/bde_series_full_load.Rd b/man/bde_series_full_load.Rd index 11a0017c..4c310c64 100644 --- a/man/bde_series_full_load.Rd +++ b/man/bde_series_full_load.Rd @@ -39,8 +39,8 @@ debugging.} metadata of the requested series.} } \value{ -A tibble with a field "Date" and the alias of the fields series as -described on the catalogs. See \code{\link[=bde_catalog_load]{bde_catalog_load()}}. +A \link[tibble:tibble]{tibble} with a field "Date" and the alias of the +fields series as described on the catalogs. See \code{\link[=bde_catalog_load]{bde_catalog_load()}}. } \description{ Load a full time-series file provided by BdE. diff --git a/man/bde_series_load.Rd b/man/bde_series_load.Rd index f53cb6fe..08009573 100644 --- a/man/bde_series_load.Rd +++ b/man/bde_series_load.Rd @@ -49,7 +49,7 @@ debugging.} metadata of the requested series.} } \value{ -A \code{tibble} with a field "Date" and : +A \link[tibble:tibble]{tibble} with a field "Date" and : \itemize{ \item With \code{out_format = "wide"} each series is presented in a separate column with the name defined by \code{series_label}. diff --git a/man/figures/README-palettes-1.png b/man/figures/README-palettes-1.png deleted file mode 100644 index 845c7eeff6b355d686b721fcfe8cea0cf19539b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21823 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 diff --git a/man/scales_bde.Rd b/man/scales_bde.Rd index 70282f6b..8d086fd9 100644 --- a/man/scales_bde.Rd +++ b/man/scales_bde.Rd @@ -10,18 +10,46 @@ \alias{scale_fill_bde_c} \title{BdE scales for \CRANpkg{ggplot2}.} \usage{ -scale_color_bde_d(palette = c("bde_vivid_pal", "bde_rose_pal"), ...) +scale_color_bde_d( + palette = c("bde_vivid_pal", "bde_rose_pal"), + alpha = NULL, + rev = FALSE, + ... +) -scale_fill_bde_d(palette = c("bde_vivid_pal", "bde_rose_pal"), ...) +scale_fill_bde_d( + palette = c("bde_vivid_pal", "bde_rose_pal"), + alpha = NULL, + rev = FALSE, + ... +) -scale_color_bde_c(palette = c("bde_rose_pal", "bde_vivid_pal"), ...) +scale_color_bde_c( + palette = c("bde_rose_pal", "bde_vivid_pal"), + alpha = NULL, + rev = FALSE, + ... +) -scale_fill_bde_c(palette = c("bde_rose_pal", "bde_vivid_pal"), ...) +scale_fill_bde_c( + palette = c("bde_rose_pal", "bde_vivid_pal"), + alpha = NULL, + rev = FALSE, + ... +) } \arguments{ \item{palette}{Name of the BdE palette to apply. One of \code{"bde_vivid_pal"}, \code{"bde_rose_pal"}. See \code{\link[=bde_palettes]{bde_palettes()}} for details.} +\item{alpha}{An alpha-transparency level in the range \verb{[0,1]} (\code{0} means +transparent and \code{1} means opaque). A missing, i.e., \code{alpha = NULL}, does +not add opacity codes (\code{"FF"}) to the individual color hex codes. See +\code{\link[ggplot2:reexports]{ggplot2::alpha()}}.} + +\item{rev}{Logical indicating whether the ordering of the colors should be +reversed.} + \item{...}{Further arguments of \code{\link[ggplot2:discrete_scale]{ggplot2::discrete_scale()}} or \code{\link[ggplot2:continuous_scale]{ggplot2::continuous_scale()}}.} } diff --git a/man/theme_tidybde.Rd b/man/theme_tidybde.Rd index 1c83ef8e..127ccb43 100644 --- a/man/theme_tidybde.Rd +++ b/man/theme_tidybde.Rd @@ -47,7 +47,7 @@ if (nrow(series_TC) > 0) { names(series_TC_pivot) <- c("x", "y") ggplot(series_TC_pivot, aes(x = x, y = y)) + - geom_line(linewidth = 0.8, color = bde_vivid_pal()(1)) + + geom_line(linewidth = 0.8, color = bde_palettes(n = 1)) + labs( title = "Title", subtitle = "Some metric", diff --git a/tests/testthat.R b/tests/testthat.R index 0770a35d..dcd367a5 100644 --- a/tests/testthat.R +++ b/tests/testthat.R @@ -1,3 +1,11 @@ +# This file is part of the standard setup for testthat. +# It is recommended that you do not modify it. +# +# Where should you do additional test configuration? +# Learn more about the roles of various files in: +# * https://r-pkgs.org/testing-design.html#sec-tests-files-overview +# * https://testthat.r-lib.org/articles/special-files.html + library(testthat) library(tidyBdE) diff --git a/tests/testthat/_snaps/bde_col_pal.md b/tests/testthat/_snaps/bde_palettes.md similarity index 100% rename from tests/testthat/_snaps/bde_col_pal.md rename to tests/testthat/_snaps/bde_palettes.md diff --git a/tests/testthat/test-deprecated.R b/tests/testthat/test-deprecated.R index acfe8642..0c3d936d 100644 --- a/tests/testthat/test-deprecated.R +++ b/tests/testthat/test-deprecated.R @@ -1,7 +1,7 @@ test_that("bde_vivid_pal", { + skip_if_not_installed("lifecycle") expect_snapshot(vpal <- bde_vivid_pal()(3)) - expect_identical( bde_palettes(n = 3, "bde_vivid_pal"), vpal @@ -9,9 +9,9 @@ test_that("bde_vivid_pal", { }) test_that("bde_rose_pal", { + skip_if_not_installed("lifecycle") expect_snapshot(vpal <- bde_rose_pal()(4)) - expect_identical( bde_palettes(n = 4, "bde_rose_pal"), vpal diff --git a/tests/testthat/test-scales.R b/tests/testthat/test-scales.R index 8265be7f..dcd8d449 100644 --- a/tests/testthat/test-scales.R +++ b/tests/testthat/test-scales.R @@ -15,13 +15,22 @@ test_that("Discrete scale", { mod3 <- ggplot2::layer_data(p3)$colour expect_identical(mod, mod3) + # Alpha + + p3 <- p + scale_colour_bde_d(alpha = 0.9) + + mod_alpha <- ggplot2::layer_data(p3)$colour + + expect_true(all(ggplot2::alpha(mod, 0.9) == mod_alpha)) + + # Another pal p4 <- p + scale_color_bde_d(palette = "bde_rose_pal") mod4 <- ggplot2::layer_data(p4)$colour expect_false(any(mod == mod4)) - # Another param + # Another aes pf <- ggplot2::ggplot(d) + ggplot2::geom_point(ggplot2::aes(x, y, fill = l), shape = 21) @@ -38,51 +47,48 @@ test_that("Discrete scale", { test_that("Continous scale", { - skip("Not ready yet") d <- data.frame(x = 1:5, y = 1:5, z = 21:25, l = letters[1:5]) p <- ggplot2::ggplot(d) + ggplot2::geom_point(ggplot2::aes(x, y, colour = z)) init <- ggplot2::layer_data(p)$colour - p2 <- p + scale_colour_terrain_c() + p2 <- p + scale_color_bde_c() mod <- ggplot2::layer_data(p2)$colour expect_true(!any(init %in% mod)) # Renamed - p3 <- p + scale_color_terrain_c() + p3 <- p + scale_colour_bde_c() mod3 <- ggplot2::layer_data(p3)$colour expect_identical(mod, mod3) # Alpha - expect_snapshot(p + scale_colour_terrain_c(alpha = -1), - error = TRUE - ) - p3 <- p + scale_colour_terrain_c(alpha = 0.9) + p3 <- p + scale_colour_bde_c(alpha = 0.9) mod_alpha <- ggplot2::layer_data(p3)$colour - expect_true(all(adjustcolor(mod, alpha.f = 0.9) == mod_alpha)) + expect_true(all(ggplot2::alpha(mod, 0.9) == mod_alpha)) - # Reverse also with alpha - expect_snapshot(p + scale_colour_terrain_c(direction = 0.5), - error = TRUE - ) + # Another pal + p4 <- p + scale_color_bde_c(palette = "bde_vivid_pal") + mod4 <- ggplot2::layer_data(p4)$colour + expect_false(any(mod == mod4)) + # Another aes + pf <- ggplot2::ggplot(d) + + ggplot2::geom_point(ggplot2::aes(x, y, fill = z), shape = 21) - p4 <- p + scale_colour_terrain_c( - direction = -1, - alpha = 0.7 - ) + pfill <- pf + scale_fill_bde_c() + colfill <- ggplot2::layer_data(pfill)$fill - mod_alpha_rev <- ggplot2::layer_data(p4)$colour + expect_identical(mod, colfill) + pfill2 <- pf + scale_fill_bde_c(palette = "bde_vivid_pal") + colfill2 <- ggplot2::layer_data(pfill2)$fill - expect_true( - all(rev(adjustcolor(mod, alpha.f = 0.7)) == mod_alpha_rev) - ) + expect_identical(mod4, colfill2) }) diff --git a/vignettes/articles/Main_Macroeconomic_Series.Rmd b/vignettes/articles/Main_Macroeconomic_Series.Rmd index b77ce5d8..c64ea9a9 100644 --- a/vignettes/articles/Main_Macroeconomic_Series.Rmd +++ b/vignettes/articles/Main_Macroeconomic_Series.Rmd @@ -30,7 +30,7 @@ library(dplyr) library(tidyr) -col <- tidyBdE::bde_rose_pal()(1) +col <- bde_palettes(1, "bde_rose_pal") date <- Sys.Date() ny <- as.numeric(format(date, format = "%Y")) - 4 nd <- as.Date(paste0(ny, "-12-31")) diff --git a/vignettes/chart-1.png b/vignettes/chart-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2da3f832772be891202e4525b552803df1579298 GIT binary patch literal 26556 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 literal 0 HcmV?d00001 diff --git a/vignettes/tidyBdE.Rmd b/vignettes/tidyBdE.Rmd index 5d208ea9..03e6672e 100644 --- a/vignettes/tidyBdE.Rmd +++ b/vignettes/tidyBdE.Rmd @@ -86,8 +86,8 @@ BdE: ```r ggplot(time_series, aes(x = Date, y = EUR_GBP_XR)) + - geom_line(colour = bde_vivid_pal()(1)) + - geom_smooth(method = "gam", colour = bde_vivid_pal()(2)[2]) + + geom_line(colour = bde_palettes(n = 1)) + + geom_smooth(method = "gam", colour = bde_palettes(n = 2)[2]) + labs( title = "EUR/GBP Exchange Rate (2010-2020)", subtitle = "%", @@ -106,8 +106,10 @@ ggplot(time_series, aes(x = Date, y = EUR_GBP_XR)) + theme_tidybde() ``` -![EUR/GBP Exchange Rate (2010-2020) via -tidyBdE](../man/figures/README-chart-1.png) +
+EUR/GBP Exchange Rate (2010-2020) +

EUR/GBP Exchange Rate (2010-2020)

+
The package provides also several "shortcut" functions for a selection of the most relevant macroeconomic series, so there is no need to look for them in diff --git a/vignettes/tidyBdE.Rmd.orig b/vignettes/tidyBdE.Rmd.orig index 2d5e455e..1a998be9 100644 --- a/vignettes/tidyBdE.Rmd.orig +++ b/vignettes/tidyBdE.Rmd.orig @@ -17,7 +17,7 @@ knitr::opts_chunk$set( tidy = "styler", warning = FALSE, message = FALSE, - dpi = 300, + dpi = 120, dev = "ragg_png", fig.path = "./", out.width = "100%" @@ -93,11 +93,11 @@ time_series <- bde_series_load(seq_number, series_label = "EUR_GBP_XR") %>% The package also provides a custom `ggplot2` theme based on the publications of BdE: -```{r chart, eval=FALSE} +```{r chart, eval=TRUE, fig.cap='EUR/GBP Exchange Rate (2010-2020)', fig.asp=0.7} ggplot(time_series, aes(x = Date, y = EUR_GBP_XR)) + - geom_line(colour = bde_vivid_pal()(1)) + - geom_smooth(method = "gam", colour = bde_vivid_pal()(2)[2]) + + geom_line(colour = bde_palettes(n=1)) + + geom_smooth(method = "gam", colour = bde_palettes(n=2)[2]) + labs(title = "EUR/GBP Exchange Rate (2010-2020)", subtitle = "%", caption = "Source: BdE") + @@ -113,9 +113,6 @@ ggplot(time_series, aes(x = Date, y = EUR_GBP_XR)) + ``` -![EUR/GBP Exchange Rate (2010-2020) via -tidyBdE](../man/figures/README-chart-1.png) - The package provides also several "shortcut" functions for a selection of the most relevant macroeconomic series, so there is no need to look for them in advance: