From ad61790a738deba548e543d1025c2583420e14dd Mon Sep 17 00:00:00 2001 From: Trevor L Davis Date: Mon, 2 Oct 2023 23:01:25 -0700 Subject: [PATCH] feat: 'reset_image_cache()' * `reset_image_cache()` resets the image cache used by `grid.pattern_image()` and `grid.pattern_placeholder()` to store images (#63). closes #25, closes #63 --- DESCRIPTION | 6 +++--- NAMESPACE | 1 + NEWS.md | 12 +++++++++--- R/pattern-array-image.R | 6 +++++- R/pattern-array-magick.R | 2 +- R/pattern-array-placeholder.R | 3 ++- R/pattern-array-plasma.R | 3 ++- R/reset_image_cache.R | 9 +++++++++ cran-comments.md | 3 +++ man/grid.pattern_image.Rd | 6 +++++- man/grid.pattern_magick.Rd | 2 +- man/grid.pattern_placeholder.Rd | 5 ++++- man/grid.pattern_plasma.Rd | 3 ++- man/gridpattern-package.Rd | 2 +- man/reset_image_cache.Rd | 13 +++++++++++++ tests/figs/array/plasma.png | Bin 0 -> 35897 bytes tests/testthat/test_array.R | 14 +++++++------- 17 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 R/reset_image_cache.R create mode 100644 man/reset_image_cache.Rd create mode 100644 tests/figs/array/plasma.png diff --git a/DESCRIPTION b/DESCRIPTION index 34711c1..32a3833 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,9 +1,9 @@ Package: gridpattern Type: Package Title: 'grid' Pattern Grobs -Version: 1.0.4 +Version: 1.1.0 Authors@R: c(person("Mike", "FC", role = "aut", comment = "Code/docs adapted from ggpattern"), - person("Trevor L.", "Davis", role=c("aut", "cre"), email="trevor.l.davis@gmail.com", + person("Trevor L", "Davis", role=c("aut", "cre"), email="trevor.l.davis@gmail.com", comment = c(ORCID = "0000-0001-6341-4639")), person("Thomas Lin", "Pedersen", role = "ctb", comment = "new_data_frame() copied from ggplot2")) Description: Provides 'grid' grobs that fill in a user-defined area with various patterns. Includes enhanced versions of the geometric and image-based patterns originally contained in the 'ggpattern' package as well as original 'pch', 'polygon_tiling', 'regular_polygon', 'rose', 'text', 'wave', and 'weave' patterns plus support for custom user-defined patterns. @@ -27,7 +27,7 @@ Imports: Suggests: ambient, knitr, - magick, + magick (>= 2.7.4), ragg (>= 1.2.0), rmarkdown, svglite (>= 2.1.0), diff --git a/NAMESPACE b/NAMESPACE index 68c8cce..89e60d7 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -40,6 +40,7 @@ export(patternGrob) export(pattern_hex) export(pattern_square) export(pattern_weave) +export(reset_image_cache) export(star_angle) export(star_scale) import(grid) diff --git a/NEWS.md b/NEWS.md index b4d9c06..1523dd1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,8 +1,14 @@ -gridpattern v1.0.4 +gridpattern v1.1.0 ================== -Minor improvements ------------------- +New Features +------------ + +* `reset_image_cache()` resets the image cache used by `grid.pattern_image()` + and `grid.pattern_placeholder()` to store images (#63). + +Bug fixes and minor improvements +-------------------------------- * The function `guess_has_R4.1_features()` is now available as a "standalone" file. You may copy its source under the permissive [MIT No Attribution (MIT-0)](https://spdx.org/licenses/MIT-0.html) diff --git a/R/pattern-array-image.R b/R/pattern-array-image.R index 6aee227..5277266 100644 --- a/R/pattern-array-image.R +++ b/R/pattern-array-image.R @@ -21,7 +21,8 @@ #' @param filter Filter to use when scaling. `magick::filter_types()` returns a vector of supported values. #' @return A grid grob object invisibly. If `draw` is `TRUE` then also draws to the graphic device as a side effect. #' @examples -#' if (require("magick")) { +#' \donttest{# May emit a "CPU time > 2.5 times elapsed time" NOTE in a CRAN check +#' if (requireNamespace("magick")) { #' x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' logo_filename <- system.file("img", "Rlogo.png" , package = "png") @@ -33,8 +34,11 @@ #' try(grid.pattern_image(x_hex, y_hex, filename = logo_filename, #' type = "tile")) #' } +#' } #' @seealso [grid.pattern_placeholder()] is an image pattern that uses images #' downloaded from the internet. +#' [reset_image_cache()] resets the image cache used by `grid.pattern_image()` +#' and [grid.pattern_placeholder()]. #' @export grid.pattern_image <- function(x = c(0, 0, 1, 1), y = c(1, 0, 0, 1), id = 1L, ..., filename = "", type = "fit", scale = 1, diff --git a/R/pattern-array-magick.R b/R/pattern-array-magick.R index d50d7d4..8d5885c 100644 --- a/R/pattern-array-magick.R +++ b/R/pattern-array-magick.R @@ -12,7 +12,7 @@ #' @param fill Fill colour #' @return A grid grob object invisibly. If `draw` is `TRUE` then also draws to the graphic device as a side effect. #' @examples -#' if (require("magick")) { +#' if (requireNamespace("magick")) { #' x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' grid.pattern_magick(x_hex, y_hex, type="octagons", fill="blue", scale=2) diff --git a/R/pattern-array-placeholder.R b/R/pattern-array-placeholder.R index 671e79f..ed5d512 100644 --- a/R/pattern-array-placeholder.R +++ b/R/pattern-array-placeholder.R @@ -8,7 +8,7 @@ #' If you would like only greyscale images append `bw` to the name. #' @return A grid grob object invisibly. If `draw` is `TRUE` then also draws to the graphic device as a side effect. #' @examples -#' if (require("magick")) { +#' if (requireNamespace("magick")) { #' x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' # requires internet connection to download from placeholder image websites @@ -16,6 +16,7 @@ #' } #' #' print(names_placeholder) +#' @seealso [reset_image_cache()] resets the image cache used by [grid.pattern_image()] and `grid.pattern_placeholder()`. #' @export grid.pattern_placeholder <- function(x = c(0, 0, 1, 1), y = c(1, 0, 0, 1), id = 1L, ..., type = "kitten", alpha = gp$alpha %||% NA_real_, diff --git a/R/pattern-array-plasma.R b/R/pattern-array-plasma.R index 09efb21..c1aa0f0 100644 --- a/R/pattern-array-plasma.R +++ b/R/pattern-array-plasma.R @@ -6,12 +6,13 @@ #' @param scale Extra scaling #' @return A grid grob object invisibly. If `draw` is `TRUE` then also draws to the graphic device as a side effect. #' @examples -#' if (require("magick")) { +#' if (requireNamespace("magick")) { #' x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) #' grid.pattern_plasma(x_hex, y_hex, fill = "green") #' } #' @seealso [grid.pattern_ambient()] provides a noise pattern using the `ambient` package. +#' Pseudorandom seeds for the plasma pattern may be set via [magick::magick_set_seed()]. #' @export grid.pattern_plasma <- function(x = c(0, 0, 1, 1), y = c(1, 0, 0, 1), id = 1L, ..., fill = gp$fill %||% "grey80", scale = 1, alpha = gp$alpha %||% NA_real_, diff --git a/R/reset_image_cache.R b/R/reset_image_cache.R new file mode 100644 index 0000000..10f7707 --- /dev/null +++ b/R/reset_image_cache.R @@ -0,0 +1,9 @@ +#' Reset 'gridpattern' image cache +#' +#' [grid.pattern_image()] and [grid.pattern_placeholder()] store images in a cache +#' (so we won't download image URLs over and over). +#' `reset_image_cache()` resets this cache. +#' @export +reset_image_cache <- function() { + memoise::forget(img_read_memoised) +} diff --git a/cran-comments.md b/cran-comments.md index 1bde40e..0563eb6 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,3 +1,6 @@ +* Example that triggered a "Examples with CPU time > 2.5 times elapsed time" NOTE + is now wrapped in `\donttest{}`. + ## Test environments * local (linux, R 4.3.1) diff --git a/man/grid.pattern_image.Rd b/man/grid.pattern_image.Rd index 68f63fb..ab460b9 100644 --- a/man/grid.pattern_image.Rd +++ b/man/grid.pattern_image.Rd @@ -87,7 +87,8 @@ Affected by \code{scale} and \code{gravity}.} } } \examples{ - if (require("magick")) { + \donttest{# May emit a "CPU time > 2.5 times elapsed time" NOTE in a CRAN check + if (requireNamespace("magick")) { x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) logo_filename <- system.file("img", "Rlogo.png" , package = "png") @@ -99,8 +100,11 @@ Affected by \code{scale} and \code{gravity}.} try(grid.pattern_image(x_hex, y_hex, filename = logo_filename, type = "tile")) } + } } \seealso{ \code{\link[=grid.pattern_placeholder]{grid.pattern_placeholder()}} is an image pattern that uses images downloaded from the internet. +\code{\link[=reset_image_cache]{reset_image_cache()}} resets the image cache used by \code{grid.pattern_image()} +and \code{\link[=grid.pattern_placeholder]{grid.pattern_placeholder()}}. } diff --git a/man/grid.pattern_magick.Rd b/man/grid.pattern_magick.Rd index ac13393..f6b7c77 100644 --- a/man/grid.pattern_magick.Rd +++ b/man/grid.pattern_magick.Rd @@ -93,7 +93,7 @@ A grid grob object invisibly. If \code{draw} is \code{TRUE} then also draws to plus subsets for shaded intensity and stripes. } \examples{ - if (require("magick")) { + if (requireNamespace("magick")) { x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) grid.pattern_magick(x_hex, y_hex, type="octagons", fill="blue", scale=2) diff --git a/man/grid.pattern_placeholder.Rd b/man/grid.pattern_placeholder.Rd index eb932e3..bf5893a 100644 --- a/man/grid.pattern_placeholder.Rd +++ b/man/grid.pattern_placeholder.Rd @@ -71,7 +71,7 @@ A grid grob object invisibly. If \code{draw} is \code{TRUE} then also draws to \code{names_placeholder} are character vectors of supported placeholder types. } \examples{ - if (require("magick")) { + if (requireNamespace("magick")) { x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) # requires internet connection to download from placeholder image websites @@ -80,4 +80,7 @@ A grid grob object invisibly. If \code{draw} is \code{TRUE} then also draws to print(names_placeholder) } +\seealso{ +\code{\link[=reset_image_cache]{reset_image_cache()}} resets the image cache used by \code{\link[=grid.pattern_image]{grid.pattern_image()}} and \code{grid.pattern_placeholder()}. +} \keyword{datasets} diff --git a/man/grid.pattern_plasma.Rd b/man/grid.pattern_plasma.Rd index ed75230..6f4c4fc 100644 --- a/man/grid.pattern_plasma.Rd +++ b/man/grid.pattern_plasma.Rd @@ -65,7 +65,7 @@ A grid grob object invisibly. If \code{draw} is \code{TRUE} then also draws to \code{grid.pattern_plasma()} draws a plasma pattern onto the graphic device. } \examples{ - if (require("magick")) { + if (requireNamespace("magick")) { x_hex <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) y_hex <- 0.5 + 0.5 * sin(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) grid.pattern_plasma(x_hex, y_hex, fill = "green") @@ -73,4 +73,5 @@ A grid grob object invisibly. If \code{draw} is \code{TRUE} then also draws to } \seealso{ \code{\link[=grid.pattern_ambient]{grid.pattern_ambient()}} provides a noise pattern using the \code{ambient} package. +Pseudorandom seeds for the plasma pattern may be set via \code{\link[magick:config]{magick::magick_set_seed()}}. } diff --git a/man/gridpattern-package.Rd b/man/gridpattern-package.Rd index 318f23b..aea4472 100644 --- a/man/gridpattern-package.Rd +++ b/man/gridpattern-package.Rd @@ -46,7 +46,7 @@ Useful links: } \author{ -\strong{Maintainer}: Trevor L. Davis \email{trevor.l.davis@gmail.com} (\href{https://orcid.org/0000-0001-6341-4639}{ORCID}) +\strong{Maintainer}: Trevor L Davis \email{trevor.l.davis@gmail.com} (\href{https://orcid.org/0000-0001-6341-4639}{ORCID}) Authors: \itemize{ diff --git a/man/reset_image_cache.Rd b/man/reset_image_cache.Rd new file mode 100644 index 0000000..0db757c --- /dev/null +++ b/man/reset_image_cache.Rd @@ -0,0 +1,13 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reset_image_cache.R +\name{reset_image_cache} +\alias{reset_image_cache} +\title{Reset 'gridpattern' image cache} +\usage{ +reset_image_cache() +} +\description{ +\code{\link[=grid.pattern_image]{grid.pattern_image()}} and \code{\link[=grid.pattern_placeholder]{grid.pattern_placeholder()}} store images in a cache +(so we won't download image URLs over and over). +\code{reset_image_cache()} resets this cache. +} diff --git a/tests/figs/array/plasma.png b/tests/figs/array/plasma.png new file mode 100644 index 0000000000000000000000000000000000000000..1273104b63c46ddb2a672484a5330dd45671c9a0 GIT binary patch literal 35897 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 literal 0 HcmV?d00001 diff --git a/tests/testthat/test_array.R b/tests/testthat/test_array.R index dc78ad3..b08e8bf 100644 --- a/tests/testthat/test_array.R +++ b/tests/testthat/test_array.R @@ -35,7 +35,7 @@ test_that("array patterns works as expected", { skip_on_ci() skip_on_cran() skip_if_not(capabilities("cairo")) - skip_if_not_installed("magick") + skip_if_not_installed("magick", "2.7.4") skip_if_not_installed("ragg") x <- 0.5 + 0.5 * cos(seq(2 * pi / 4, by = 2 * pi / 6, length.out = 6)) @@ -71,6 +71,12 @@ test_that("array patterns works as expected", { function() grid.pattern_plasma(x = c(0.5, 0.5, 0.5, 0.5), y = c(0, 1, 1, 0), fill = "green")) + test_raster("plasma.png", + function() { + magick::magick_set_seed(42) # introduced in v2.7.4 + grid.pattern_plasma(x, y, fill = "green") + }) + playing_card_symbols <- c("\u2660", "\u2665", "\u2666", "\u2663") test_raster("text.png", function() grid.pattern_text(x, y, shape = playing_card_symbols, @@ -85,12 +91,6 @@ test_that("array patterns works as expected", { use_R4.1_masks = NULL, frequency = 1:4, gp = gp)) - # plasma images are random and doesn't seem to be a way to set a seed - tmpfile <- tempfile(fileext = ".png") - grob <- my_png(tmpfile, function() grid.pattern_plasma(fill="green")) - unlink(tmpfile) - expect_true(inherits(grob, "pattern")) - create_pattern_simple <- function(width, height, params, legend) { choice <- params$pattern_type if (is.null(choice) || is.na(choice) || !is.character(choice)) {