From 8c40ec271a6a18f17e04085813238b41c5ae601f Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Fri, 5 Jul 2024 11:01:10 +0200 Subject: [PATCH 1/5] reset functions --- R/geom-defaults.R | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/R/geom-defaults.R b/R/geom-defaults.R index 8b81eeef94..408664e8e1 100644 --- a/R/geom-defaults.R +++ b/R/geom-defaults.R @@ -44,6 +44,10 @@ update_stat_defaults <- function(stat, new) { update_defaults(stat, "Stat", new, env = parent.frame()) } +reset_geom_defaults <- function() reset_defaults("geom") + +reset_stat_defaults <- function() reset_defaults("stat") + cache_defaults <- new_environment() update_defaults <- function(name, subclass, new, env = parent.frame()) { @@ -73,3 +77,20 @@ update_defaults <- function(name, subclass, new, env = parent.frame()) { } } + +reset_defaults <- function(type) { + # Lookup matching names in cache + prefix <- paste0("^", type, "_") + full_names <- grep(prefix, ls(cache_defaults), value = TRUE) + # Early exit if there is nothing to reset + if (length(full_names) < 1) { + return(invisible()) + } + # Format names without prefix + short_names <- gsub(prefix, "", full_names) + names(short_names) <- full_names + + # Run updates + update <- switch(type, geom = update_geom_defaults, update_stat_defaults) + invisible(lapply(short_names, update, new = NULL)) +} From 66cb91f8e3e0b68a9dd5f9a42ad2d7f94dfb29a3 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Fri, 5 Jul 2024 11:01:25 +0200 Subject: [PATCH 2/5] document --- NAMESPACE | 2 ++ R/geom-defaults.R | 15 +++++++++++++-- man/update_defaults.Rd | 17 ++++++++++++++--- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 9068973de0..07908f779d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -512,6 +512,8 @@ export(remove_missing) export(render_axes) export(render_strips) export(replace_theme) +export(reset_geom_defaults) +export(reset_stat_defaults) export(reset_theme_settings) export(resolution) export(scale_alpha) diff --git a/R/geom-defaults.R b/R/geom-defaults.R index 408664e8e1..e4e09ce71c 100644 --- a/R/geom-defaults.R +++ b/R/geom-defaults.R @@ -1,5 +1,7 @@ #' Modify geom/stat aesthetic defaults for future plots #' +#' Functions to update or reset the default aesthetics of geoms and stats. +#' #' @param stat,geom Name of geom/stat to modify (like `"point"` or #' `"bin"`), or a Geom/Stat object (like `GeomPoint` or #' `StatBin`). @@ -17,9 +19,11 @@ #' GeomPoint$default_aes #' ggplot(mtcars, aes(mpg, wt)) + geom_point() #' -#' # reset default +#' # reset single default #' update_geom_defaults("point", NULL) #' +#' # reset all defaults +#' reset_geom_defaults() #' #' # updating a stat's default aesthetic settings #' # example: change stat_bin()'s default y-axis to the density scale @@ -30,9 +34,12 @@ #' geom_histogram() + #' geom_function(fun = dnorm, color = "red") #' -#' # reset default +#' # reset single default #' update_stat_defaults("bin", NULL) #' +#' # reset all defaults +#' reset_stat_defaults() +#' #' @rdname update_defaults update_geom_defaults <- function(geom, new) { update_defaults(geom, "Geom", new, env = parent.frame()) @@ -44,8 +51,12 @@ update_stat_defaults <- function(stat, new) { update_defaults(stat, "Stat", new, env = parent.frame()) } +#' @rdname update_defaults +#' @export reset_geom_defaults <- function() reset_defaults("geom") +#' @rdname update_defaults +#' @export reset_stat_defaults <- function() reset_defaults("stat") cache_defaults <- new_environment() diff --git a/man/update_defaults.Rd b/man/update_defaults.Rd index 8006bf8246..334dffed8e 100644 --- a/man/update_defaults.Rd +++ b/man/update_defaults.Rd @@ -3,11 +3,17 @@ \name{update_geom_defaults} \alias{update_geom_defaults} \alias{update_stat_defaults} +\alias{reset_geom_defaults} +\alias{reset_stat_defaults} \title{Modify geom/stat aesthetic defaults for future plots} \usage{ update_geom_defaults(geom, new) update_stat_defaults(stat, new) + +reset_geom_defaults() + +reset_stat_defaults() } \arguments{ \item{new}{One of the following: @@ -21,7 +27,7 @@ update_stat_defaults(stat, new) \code{StatBin}).} } \description{ -Modify geom/stat aesthetic defaults for future plots +Functions to update or reset the default aesthetics of geoms and stats. } \examples{ @@ -32,9 +38,11 @@ update_geom_defaults("point", aes(color = "red")) GeomPoint$default_aes ggplot(mtcars, aes(mpg, wt)) + geom_point() -# reset default +# reset single default update_geom_defaults("point", NULL) +# reset all defaults +reset_geom_defaults() # updating a stat's default aesthetic settings # example: change stat_bin()'s default y-axis to the density scale @@ -45,8 +53,11 @@ ggplot(data.frame(x = rnorm(1e3)), aes(x)) + geom_histogram() + geom_function(fun = dnorm, color = "red") -# reset default +# reset single default update_stat_defaults("bin", NULL) +# reset all defaults +reset_stat_defaults() + } \keyword{internal} From fa72a1f60c97a58e0019a9449e089438c57e64cc Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Fri, 5 Jul 2024 11:01:30 +0200 Subject: [PATCH 3/5] add test --- tests/testthat/test-geom-.R | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/testthat/test-geom-.R b/tests/testthat/test-geom-.R index 61063d5d95..558b05475b 100644 --- a/tests/testthat/test-geom-.R +++ b/tests/testthat/test-geom-.R @@ -20,6 +20,13 @@ test_that("geom defaults can be set and reset", { test <- l$geom$use_defaults(data_frame0()) expect_equal(test$colour, "black") expect_equal(inv$colour, "red") + + inv <- update_geom_defaults("line", list(colour = "blue")) + reset <- reset_geom_defaults() + + expect_equal(reset$geom_line$colour, "blue") + expect_equal(reset$geom_point$colour, GeomPoint$default_aes$colour) + expect_equal(GeomLine$default_aes$colour, orig$colour) }) test_that("updating geom aesthetic defaults preserves class and order", { From d52a513bcdf00944ebeb26bbfa1d64ede90ed806 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Fri, 5 Jul 2024 11:09:02 +0200 Subject: [PATCH 4/5] add news bullet --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index d553c7f924..b65f60666d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # ggplot2 (development version) +* New `reset_geom_defaults()` and `reset_stat_defaults()` to restore all geom or + stat default aesthetics at once (@teunbrand, #5975). * `stat_bin()` now accepts functions for argument `breaks` (@aijordan, #4561) * (internal) The plot's layout now has a coord parameter that is used to prevent setting up identical panel parameters (#5427) From 3e055a83edb2fc77a486c63ee835d3af96403f2e Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Mon, 8 Jul 2024 16:42:56 +0200 Subject: [PATCH 5/5] fix typo --- tests/testthat/test-geom-.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-geom-.R b/tests/testthat/test-geom-.R index 558b05475b..e0a0ca060a 100644 --- a/tests/testthat/test-geom-.R +++ b/tests/testthat/test-geom-.R @@ -26,7 +26,7 @@ test_that("geom defaults can be set and reset", { expect_equal(reset$geom_line$colour, "blue") expect_equal(reset$geom_point$colour, GeomPoint$default_aes$colour) - expect_equal(GeomLine$default_aes$colour, orig$colour) + expect_equal(GeomLine$default_aes$colour, inv$colour) }) test_that("updating geom aesthetic defaults preserves class and order", {