Skip to content

Commit a908fe7

Browse files
authored
Merge pull request #3286 from paleolimbot/issue-3090-warn-data-hline-vline-abline
redo warnings for overwritten arguments in abline, hline, and vline (fixes #3090)
2 parents 8371417 + 9590b7f commit a908fe7

File tree

5 files changed

+109
-28
lines changed

5 files changed

+109
-28
lines changed

NEWS.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# ggplot2 (development version)
22

3+
* `geom_abline()`, `geom_hline()`, and `geom_vline()` now issue
4+
more informative warnings when supplied with set aesthetics
5+
(i.e., `slope`, `intercept`, `yintercept`, and/or `xintercept`)
6+
and mapped aesthetics (i.e., `data` and/or `mapping`).
7+
38
# ggplot2 3.1.1.9000
49

510
This is a minor release with an emphasis on internal changes to make ggplot2

R/geom-abline.r

+38-8
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,20 @@ geom_abline <- function(mapping = NULL, data = NULL,
7676
show.legend = NA) {
7777

7878
# If nothing set, default to y = x
79-
if (missing(mapping) && missing(slope) && missing(intercept)) {
79+
if (is.null(mapping) && missing(slope) && missing(intercept)) {
8080
slope <- 1
8181
intercept <- 0
8282
}
8383

8484
# Act like an annotation
8585
if (!missing(slope) || !missing(intercept)) {
8686

87-
# Warn if supplied mapping is going to be overwritten
88-
if (!missing(mapping)) {
89-
warning(paste0("Using `intercept` and/or `slope` with `mapping` may",
90-
" not have the desired result as mapping is overwritten",
91-
" if either of these is specified\n"
92-
)
93-
)
87+
# Warn if supplied mapping and/or data is going to be overwritten
88+
if (!is.null(mapping)) {
89+
warn_overwritten_args("geom_abline()", "mapping", c("slope", "intercept"))
90+
}
91+
if (!is.null(data)) {
92+
warn_overwritten_args("geom_abline()", "data", c("slope", "intercept"))
9493
}
9594

9695
if (missing(slope)) slope <- 1
@@ -141,3 +140,34 @@ GeomAbline <- ggproto("GeomAbline", Geom,
141140

142141
draw_key = draw_key_abline
143142
)
143+
144+
warn_overwritten_args <- function(fun_name, overwritten_arg, provided_args, plural_join = " and/or ") {
145+
overwritten_arg_text <- paste0("`", overwritten_arg, "`")
146+
147+
n_provided_args <- length(provided_args)
148+
if (n_provided_args == 1) {
149+
provided_arg_text <- paste0("`", provided_args, "`")
150+
verb <- "was"
151+
} else if (n_provided_args == 2) {
152+
provided_arg_text <- paste0("`", provided_args, "`", collapse = plural_join)
153+
verb <- "were"
154+
} else {
155+
provided_arg_text <- paste0(
156+
paste0("`", provided_args[-n_provided_args], "`", collapse = ", "),
157+
",", plural_join,
158+
"`", provided_args[n_provided_args], "`"
159+
)
160+
verb <- "were"
161+
}
162+
163+
warning(
164+
sprintf(
165+
"%s: Ignoring %s because %s %s provided.",
166+
fun_name,
167+
overwritten_arg_text,
168+
provided_arg_text,
169+
verb
170+
),
171+
call. = FALSE
172+
)
173+
}

R/geom-hline.r

+7-7
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ geom_hline <- function(mapping = NULL, data = NULL,
1111

1212
# Act like an annotation
1313
if (!missing(yintercept)) {
14-
# Warn if supplied mapping is going to be overwritten
15-
if (!missing(mapping)) {
16-
warning(paste0("Using both `yintercept` and `mapping` may not have the",
17-
" desired result as mapping is overwritten if",
18-
" `yintercept` is specified\n"
19-
)
20-
)
14+
# Warn if supplied mapping and/or data is going to be overwritten
15+
if (!is.null(mapping)) {
16+
warn_overwritten_args("geom_hline()", "mapping", "yintercept")
2117
}
18+
if (!is.null(data)) {
19+
warn_overwritten_args("geom_hline()", "data", "yintercept")
20+
}
21+
2222
data <- new_data_frame(list(yintercept = yintercept))
2323
mapping <- aes(yintercept = yintercept)
2424
show.legend <- FALSE

R/geom-vline.r

+7-7
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ geom_vline <- function(mapping = NULL, data = NULL,
1111

1212
# Act like an annotation
1313
if (!missing(xintercept)) {
14-
# Warn if supplied mapping is going to be overwritten
15-
if (!missing(mapping)) {
16-
warning(paste0("Using both `xintercept` and `mapping` may not have the",
17-
" desired result as mapping is overwritten if",
18-
" `xintercept` is specified\n"
19-
)
20-
)
14+
# Warn if supplied mapping and/or data is going to be overwritten
15+
if (!is.null(mapping)) {
16+
warn_overwritten_args("geom_vline()", "mapping", "xintercept")
2117
}
18+
if (!is.null(data)) {
19+
warn_overwritten_args("geom_vline()", "data", "xintercept")
20+
}
21+
2222
data <- new_data_frame(list(xintercept = xintercept))
2323
mapping <- aes(xintercept = xintercept)
2424
show.legend <- FALSE

tests/testthat/test-geom-hline-vline-abline.R

+52-6
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,76 @@ test_that("curved lines in map projections", {
4646

4747
# Warning tests ------------------------------------------------------------
4848

49+
test_that("warn_overwritten_args() produces gramatically correct error messages", {
50+
expect_warning(
51+
warn_overwritten_args("fun_test", "is_overwritten", "provided"),
52+
"fun_test: Ignoring `is_overwritten` because `provided` was provided."
53+
)
54+
expect_warning(
55+
warn_overwritten_args("fun_test", "is_overwritten", c("provided1", "provided2")),
56+
"fun_test: Ignoring `is_overwritten` because `provided1` and/or `provided2` were provided."
57+
)
58+
expect_warning(
59+
warn_overwritten_args("fun_test", "is_overwritten", c("provided1", "provided2", "provided3")),
60+
"fun_test: Ignoring `is_overwritten` because `provided1`, `provided2`, and/or `provided3` were provided."
61+
)
62+
})
63+
4964
test_that("Warning if a supplied mapping is going to be overwritten", {
5065

5166
expect_warning(
5267
geom_vline(xintercept = 3, aes(colour = colour)),
53-
"Using both"
68+
"Ignoring `mapping`"
5469
)
5570

5671
expect_warning(
5772
geom_hline(yintercept = 3, aes(colour = colour)),
58-
"Using both"
73+
"Ignoring `mapping`"
5974
)
6075

6176
expect_warning(
6277
geom_abline(intercept = 3, aes(colour = colour)),
63-
"Using "
78+
"Ignoring `mapping`"
6479
)
6580

6681
expect_warning(
6782
geom_abline(intercept = 3, slope = 0.5, aes(colour = colour)),
68-
"Using "
83+
"Ignoring `mapping`"
84+
)
85+
86+
expect_warning(
87+
geom_abline(slope = 0.5, aes(colour = colour)),
88+
"Ignoring `mapping`"
89+
)
90+
})
91+
92+
93+
test_that("Warning if supplied data is going to be overwritten", {
94+
95+
sample_data <- data_frame(x = 1)
96+
97+
expect_warning(
98+
geom_vline(xintercept = 3, data = sample_data),
99+
"Ignoring `data`"
100+
)
101+
102+
expect_warning(
103+
geom_hline(yintercept = 3, data = sample_data),
104+
"Ignoring `data`"
105+
)
106+
107+
expect_warning(
108+
geom_abline(intercept = 3, data = sample_data),
109+
"Ignoring `data`"
110+
)
111+
112+
expect_warning(
113+
geom_abline(intercept = 3, slope = 0.5, data = sample_data),
114+
"Ignoring `data`"
69115
)
70116

71117
expect_warning(
72-
geom_abline(slope=0.5, aes(colour = colour)),
73-
"Using "
118+
geom_abline(slope = 0.5, data = sample_data),
119+
"Ignoring `data`"
74120
)
75121
})

0 commit comments

Comments
 (0)