Skip to content

Commit fda4dfa

Browse files
authored
Merge pull request #5146 from dkahle/class-default-aes
Closes #5145
2 parents 2c5a78c + ddd03bf commit fda4dfa

File tree

4 files changed

+100
-6
lines changed

4 files changed

+100
-6
lines changed

NEWS.md

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
(@teunbrand based on @clauswilke's suggestion #5051).
2626
* Fixed a regression in `Coord$train_panel_guides()` where names of guides were
2727
dropped (@maxsutton, #5063)
28+
* `update_geom_defaults()` and `update_stat_defaults()` now return properly
29+
classed objects and have updated docs (@dkahle, #5146)
2830

2931
# ggplot2 3.4.0
3032
This is a minor release focusing on tightening up the internals and ironing out

R/geom-defaults.r

+31-4
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,38 @@
77
#' @keywords internal
88
#' @export
99
#' @examples
10-
#' update_geom_defaults("point", list(colour = "darkblue"))
10+
#'
11+
#' # updating a geom's default aesthetic settings
12+
#' # example: change geom_point()'s default color
13+
#' GeomPoint$default_aes
14+
#' update_geom_defaults("point", aes(color = "red"))
15+
#' GeomPoint$default_aes
1116
#' ggplot(mtcars, aes(mpg, wt)) + geom_point()
12-
#' update_geom_defaults("point", list(colour = "black"))
17+
#'
18+
#' # reset default
19+
#' update_geom_defaults("point", aes(color = "black"))
20+
#'
21+
#'
22+
#' # updating a stat's default aesthetic settings
23+
#' # example: change stat_bin()'s default y-axis to the density scale
24+
#' StatBin$default_aes
25+
#' update_stat_defaults("bin", aes(y = after_stat(density)))
26+
#' StatBin$default_aes
27+
#' ggplot(data.frame(x = rnorm(1e3)), aes(x)) +
28+
#' geom_histogram() +
29+
#' geom_function(fun = dnorm, color = "red")
30+
#'
31+
#' # reset default
32+
#' update_stat_defaults("bin", aes(y = after_stat(count)))
33+
#'
1334
#' @rdname update_defaults
1435
update_geom_defaults <- function(geom, new) {
1536
g <- check_subclass(geom, "Geom", env = parent.frame())
1637
old <- g$default_aes
17-
g$default_aes <- defaults(rename_aes(new), old)
38+
new <- rename_aes(new)
39+
new_names_order <- unique(c(names(old), names(new)))
40+
new <- defaults(new, old)[new_names_order]
41+
g$default_aes[names(new)] <- new
1842
invisible()
1943
}
2044

@@ -23,6 +47,9 @@ update_geom_defaults <- function(geom, new) {
2347
update_stat_defaults <- function(stat, new) {
2448
g <- check_subclass(stat, "Stat", env = parent.frame())
2549
old <- g$default_aes
26-
g$default_aes <- defaults(rename_aes(new), old)
50+
new <- rename_aes(new)
51+
new_names_order <- unique(c(names(old), names(new)))
52+
new <- defaults(new, old)[new_names_order]
53+
g$default_aes[names(new)] <- new
2754
invisible()
2855
}

man/update_defaults.Rd

+23-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-geom-.R

+44
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,47 @@ test_that("aesthetic checking in geom throws correct errors", {
55
aes <- list(a = 1:4, b = letters[1:4], c = TRUE, d = 1:2, e = 1:5)
66
expect_snapshot_error(check_aesthetics(aes, 4))
77
})
8+
9+
10+
11+
test_that("updating geom aesthetic defaults preserves class and order", {
12+
13+
original_defaults <- GeomPoint$default_aes
14+
15+
update_geom_defaults("point", aes(color = "red"))
16+
17+
updated_defaults <- GeomPoint$default_aes
18+
19+
expect_s3_class(updated_defaults, "uneval")
20+
21+
intended_defaults <- original_defaults
22+
intended_defaults[["colour"]] <- "red"
23+
24+
expect_equal(updated_defaults, intended_defaults)
25+
26+
update_geom_defaults("point", original_defaults)
27+
28+
})
29+
30+
31+
32+
33+
test_that("updating stat aesthetic defaults preserves class and order", {
34+
35+
original_defaults <- StatBin$default_aes
36+
37+
update_stat_defaults("bin", aes(y = after_stat(density)))
38+
39+
updated_defaults <- StatBin$default_aes
40+
41+
expect_s3_class(updated_defaults, "uneval")
42+
43+
intended_defaults <- original_defaults
44+
intended_defaults[["y"]] <- expr(after_stat(density))
45+
attr(intended_defaults[["y"]], ".Environment") <- attr(updated_defaults[["y"]], ".Environment")
46+
47+
expect_equal(updated_defaults, intended_defaults)
48+
49+
update_stat_defaults("bin", original_defaults)
50+
51+
})

0 commit comments

Comments
 (0)