Skip to content

Commit 98fb83e

Browse files
committed
S7-aware is_theme_element()
1 parent 4fbf5cf commit 98fb83e

File tree

8 files changed

+42
-43
lines changed

8 files changed

+42
-43
lines changed

R/coord-sf.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ CoordSf <- ggproto("CoordSf", CoordCartesian,
334334

335335
# we don't draw the graticules if the major panel grid is
336336
# turned off
337-
if (S7::S7_inherits(el, element_blank)) {
337+
if (is_theme_element(el, "blank")) {
338338
grobs <- list(element_render(theme, "panel.background"))
339339
} else {
340340
line_gp <- gg_par(

R/guide-axis-theta.R

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ GuideAxisTheta <- ggproto(
184184

185185
build_labels = function(key, elements, params) {
186186

187-
if (S7::S7_inherits(elements$text, element_blank)) {
187+
if (is_theme_element(elements$text, "blank")) {
188188
return(zeroGrob())
189189
}
190190

@@ -268,7 +268,7 @@ GuideAxisTheta <- ggproto(
268268
key <- params$key
269269
key <- vec_slice(key, !is.na(key$.label) & nzchar(key$.label))
270270
labels <- validate_labels(key$.label)
271-
if (length(labels) == 0 || S7::S7_inherits(elements$text, element_blank)) {
271+
if (length(labels) == 0 || is_theme_element(elements$text, "blank")) {
272272
return(list(offset = offset))
273273
}
274274

@@ -365,7 +365,7 @@ GuideAxisTheta <- ggproto(
365365

366366
theta_tickmarks <- function(key, element, length, offset = NULL) {
367367
n_breaks <- nrow(key)
368-
if (n_breaks < 1 || S7::S7_inherits(element, element_blank)) {
368+
if (n_breaks < 1 || is_theme_element(element, "blank")) {
369369
return(zeroGrob())
370370
}
371371

R/guide-axis.R

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,10 @@ GuideAxis <- ggproto(
259259
override_elements = function(params, elements, theme) {
260260
elements$text <-
261261
label_angle_heuristic(elements$text, params$position, params$angle)
262-
if (S7::S7_inherits(elements$ticks, element_blank)) {
262+
if (is_theme_element(elements$ticks, "blank")) {
263263
elements$major_length <- unit(0, "cm")
264264
}
265-
if (S7::S7_inherits(elements$minor, element_blank) || isFALSE(params$minor.ticks)) {
265+
if (is_theme_element(elements$minor, "blank") || isFALSE(params$minor.ticks)) {
266266
elements$minor_length <- unit(0, "cm")
267267
}
268268
return(elements)
@@ -379,7 +379,7 @@ GuideAxis <- ggproto(
379379
# Ticks
380380
major_cm <- convertUnit(elements$major_length, "cm", valueOnly = TRUE)
381381
range <- range(0, major_cm)
382-
if (params$minor.ticks && !S7::S7_inherits(elements$minor, element_blank)) {
382+
if (params$minor.ticks && !is_theme_element(elements$minor, "blank")) {
383383
minor_cm <- convertUnit(elements$minor_length, "cm", valueOnly = TRUE)
384384
range <- range(range, minor_cm)
385385
}
@@ -590,7 +590,7 @@ axis_label_priority_between <- function(x, y) {
590590
#' overridden from the user- or theme-supplied element.
591591
#' @noRd
592592
label_angle_heuristic <- function(element, position, angle) {
593-
if (!S7::S7_inherits(element, element_text)
593+
if (!is_theme_element(element, "text")
594594
|| is.null(position)
595595
|| is.null(angle %|W|% NULL)) {
596596
return(element)

R/plot-build.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ table_add_tag <- function(table, label, theme) {
348348
return(table)
349349
}
350350
element <- calc_element("plot.tag", theme)
351-
if (S7::S7_inherits(element, element_blank)) {
351+
if (is_theme_element(element, "blank")) {
352352
return(table)
353353
}
354354

R/theme-elements.R

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -207,25 +207,6 @@ element_text <- S7::new_class(
207207
}
208208
)
209209

210-
#' @export
211-
#' @param type For testing elements: the type of element to expect. One of
212-
#' `"blank"`, `"rect"`, `"line"` or `"text"`.
213-
#' @rdname is_tests
214-
is_theme_element <- function(x, type = "any") {
215-
switch(
216-
type %||% "any",
217-
any = inherits(x, "element"),
218-
rect = inherits(x, "element_rect"),
219-
line = inherits(x, "element_line"),
220-
text = inherits(x, "element_text"),
221-
blank = inherits(x, "element_blank"),
222-
# TODO: ideally we accept more elements from extensions. We need to
223-
# consider how this will work with S7 classes, where ggplot2 doesn't know
224-
# about the extension's class objects.
225-
FALSE
226-
)
227-
}
228-
229210
#' @export
230211
#' @rdname element
231212
element_polygon <- S7::new_class(
@@ -322,6 +303,25 @@ element_geom <- S7::new_class(
322303
#' @export
323304
print.element <- function(x, ...) utils::str(x)
324305

306+
#' @export
307+
#' @param type For testing elements: the type of element to expect. One of
308+
#' `"blank"`, `"rect"`, `"line"`, `"text"`, `"polygon"`, `"point"` or `"geom"`.
309+
#' @rdname is_tests
310+
is_theme_element <- function(x, type = "any") {
311+
switch(
312+
type %||% "any",
313+
any = S7::S7_inherits(x, element),
314+
blank = S7::S7_inherits(x, element_blank),
315+
rect = S7::S7_inherits(x, element_rect),
316+
line = S7::S7_inherits(x, element_line),
317+
text = S7::S7_inherits(x, element_text),
318+
polygon = S7::S7_inherits(x, element_polygon),
319+
point = S7::S7_inherits(x, element_point),
320+
geom = S7::S7_inherits(x, element_geom),
321+
FALSE
322+
)
323+
}
324+
325325
#' @param x A single number specifying size relative to parent element.
326326
#' @rdname element
327327
#' @export
@@ -890,16 +890,15 @@ check_element <- function(el, elname, element_tree, call = caller_env()) {
890890
if (is.null(el)) return()
891891
class <- eldef$class
892892
if (inherits(class, "S7_class") && S7::S7_inherits(el)) {
893-
if (S7::S7_inherits(el, class) ||
894-
(S7::S7_inherits(el, element) && S7::S7_inherits(el, element_blank))) {
893+
if (S7::S7_inherits(el, class) || is_theme_element(el, "blank")) {
895894
return()
896895
}
897896
}
898897

899898
if (is.character(class) && "margin" %in% class) {
900899
if (!is.unit(el) && length(el) == 4)
901900
cli::cli_abort("The {.var {elname}} theme element must be a {.cls unit} vector of length 4.", call = call)
902-
} else if (!inherits(el, class) && !S7::S7_inherits(el, element_blank)) {
901+
} else if (!inherits(el, class) && !is_theme_element(el, "blank")) {
903902
if (inherits(class, "S7_class")) {
904903
class <- class@name
905904
}

R/theme.R

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ calc_element <- function(element, theme, verbose = FALSE, skip_blank = FALSE,
751751

752752
# If result is element_blank, we skip it if `skip_blank` is `TRUE`,
753753
# and otherwise we don't inherit anything from parents
754-
if (S7::S7_inherits(el_out, element_blank)) {
754+
if (is_theme_element(el_out, "blank")) {
755755
if (isTRUE(skip_blank)) {
756756
el_out <- NULL
757757
} else {
@@ -786,7 +786,7 @@ calc_element <- function(element, theme, verbose = FALSE, skip_blank = FALSE,
786786
if (verbose) cli::cli_inform("nothing (top level)")
787787

788788
# Check that all the properties of this element are non-NULL
789-
if (inherits(el_out, "ggplot2::element")) {
789+
if (is_theme_element(el_out)) {
790790
nullprops <- lengths(S7::props(el_out)) == 0
791791
} else {
792792
nullprops <- vapply(el_out, is.null, logical(1))
@@ -797,12 +797,12 @@ calc_element <- function(element, theme, verbose = FALSE, skip_blank = FALSE,
797797

798798
# if we have null properties, try to fill in from ggplot_global$theme_default
799799
el_out <- combine_elements(el_out, ggplot_global$theme_default[[element]])
800-
if (is.theme_element(el_out)) {
800+
if (is_theme_element(el_out)) {
801801
nullprops <- lengths(S7::props(el_out)) == 0
802802
} else {
803803
nullprops <- vapply(el_out, is.null, logical(1))
804804
}
805-
if (S7::S7_inherits(el_out, element_geom)) {
805+
if (is_theme_element(el_out, "geom")) {
806806
# Geom elements are expected to have NULL fill/colour, so allow these
807807
# to be missing
808808
nullprops[c("colour", "fill")] <- FALSE
@@ -861,7 +861,7 @@ merge_element <- S7::new_generic("merge_element", c("new", "old"))
861861

862862
S7::method(merge_element, list(S7::class_any, S7::class_any)) <-
863863
function(new, old, ...) {
864-
if (is.null(old) || S7::S7_inherits(old, element_blank)) {
864+
if (is.null(old) || is_theme_element(old, "blank")) {
865865
# If old is NULL or element_blank, then just return new
866866
return(new)
867867
} else if (is.null(new) || is.character(new) || is.numeric(new) || is.unit(new) ||
@@ -882,7 +882,7 @@ S7::method(merge_element, list(element_blank, S7::class_any)) <-
882882

883883
S7::method(merge_element, list(element, S7::class_any)) <-
884884
function(new, old, ...) {
885-
if (is.null(old) || S7::S7_inherits(old, element_blank)) {
885+
if (is.null(old) || is_theme_element(old, "blank")) {
886886
# If old is NULL or element_blank, then just return new
887887
return(new)
888888
}
@@ -906,7 +906,7 @@ S7::method(merge_element, list(element, S7::class_any)) <-
906906

907907
S7::method(merge_element, list(margin, S7::class_any)) <-
908908
function(new, old, ...) {
909-
if (is.null(old) || S7::S7_inherits(old, element_blank)) {
909+
if (is.null(old) || is_theme_element(old, "blank")) {
910910
return(new)
911911
}
912912
if (anyNA(new)) {
@@ -925,7 +925,7 @@ S7::method(merge_element, list(margin, S7::class_any)) <-
925925
combine_elements <- function(e1, e2) {
926926

927927
# If e2 is NULL, nothing to inherit
928-
if (is.null(e2) || S7::S7_inherits(e1, element_blank)) {
928+
if (is.null(e2) || is_theme_element(e1, "blank")) {
929929
return(e1)
930930
}
931931

@@ -948,7 +948,7 @@ combine_elements <- function(e1, e2) {
948948
return(e1)
949949
}
950950

951-
if (is.margin(e1) && is.margin(e2)) {
951+
if (is_margin(e1) && is_margin(e2)) {
952952
if (anyNA(e2)) {
953953
e2[is.na(e2)] <- unit(0, "pt")
954954
}
@@ -986,7 +986,7 @@ combine_elements <- function(e1, e2) {
986986
e1@linewidth <- e2@linewidth * unclass(e1@linewidth)
987987
}
988988

989-
if (S7::S7_inherits(e1, element_text)) {
989+
if (is_theme_element(e1, "text")) {
990990
e1@margin <- combine_elements(e1@margin, e2@margin)
991991
}
992992

man/is_tests.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-theme.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ test_that("element tree can be modified", {
345345
test_that("all elements in complete themes have inherit.blank=TRUE", {
346346
inherit_blanks <- function(theme) {
347347
all(vapply(theme, function(el) {
348-
if (is_theme_element(el) && !is_theme_element(el, "blank")) {
348+
if (is_theme_element(el) && S7::prop_exists(el, "inherit.blank")) {
349349
el@inherit.blank
350350
} else {
351351
TRUE

0 commit comments

Comments
 (0)