Skip to content

Commit d526484

Browse files
committed
allow better stat defaults updating with examples, add tests
1 parent 607089c commit d526484

File tree

3 files changed

+97
-2
lines changed

3 files changed

+97
-2
lines changed

R/geom-defaults.r

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,42 @@
77
#' @keywords internal
88
#' @export
99
#' @examples
10+
#'
11+
#' # updating a geom's default aesthetic settings
12+
#' # example: change geom_point()'s default color
1013
#' GeomPoint$default_aes
1114
#' update_geom_defaults("point", list(color = "red"))
1215
#' GeomPoint$default_aes
1316
#' ggplot(mtcars, aes(mpg, wt)) + geom_point()
17+
#'
18+
#' # reset default
1419
#' update_geom_defaults("point", list(colour = "black"))
20+
#'
21+
#' # note: adding default aesthetics is possible
22+
#' # update_geom_defaults("point", list(foo = "bar"))
23+
#' # GeomPoint$default_aes
24+
#'
25+
#'
26+
#' # updating a stat's default aesthetic settings
27+
#' # example: change stat_bin()'s default y-axis to the density scale
28+
#' StatBin$default_aes
29+
#' update_stat_defaults("bin", list(y = expr(after_stat(density))))
30+
#' StatBin$default_aes
31+
#' ggplot(data.frame(x = rnorm(1e3)), aes(x)) +
32+
#' geom_histogram() +
33+
#' geom_function(fun = dnorm, color = "red")
34+
#'
35+
#' # reset default
36+
#' update_stat_defaults("bin", list(y = expr(after_stat(density))))
37+
#'
1538
#' @rdname update_defaults
1639
update_geom_defaults <- function(geom, new) {
1740
g <- check_subclass(geom, "Geom", env = parent.frame())
1841
old <- g$default_aes
19-
g$default_aes[] <- defaults(rename_aes(new), old)[names(old)]
42+
new <- rename_aes(new)
43+
new_names_order <- unique(c(names(old), names(new)))
44+
new <- defaults(new, old)[new_names_order]
45+
g$default_aes[names(new)] <- new
2046
invisible()
2147
}
2248

@@ -25,6 +51,9 @@ update_geom_defaults <- function(geom, new) {
2551
update_stat_defaults <- function(stat, new) {
2652
g <- check_subclass(stat, "Stat", env = parent.frame())
2753
old <- g$default_aes
28-
g$default_aes[] <- defaults(rename_aes(new), old)[names(old)]
54+
new <- rename_aes(new)
55+
new_names_order <- unique(c(names(old), names(new)))
56+
new <- defaults(new, old)[new_names_order]
57+
g$default_aes[names(new)] <- new
2958
invisible()
3059
}

man/update_defaults.Rd

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-geom-.R

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,46 @@ 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", list(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", list(y = expr(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+
46+
expect_equal(updated_defaults, intended_defaults)
47+
48+
update_stat_defaults("bin", original_defaults)
49+
50+
})

0 commit comments

Comments
 (0)