diff --git a/NAMESPACE b/NAMESPACE index 2b77d638c8..32975e811c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -476,7 +476,6 @@ export(is.facet) export(is.ggplot) export(is.ggproto) export(is.theme) -export(is.waiver) export(is_coord) export(is_facet) export(is_geom) @@ -492,6 +491,7 @@ export(is_scale) export(is_stat) export(is_theme) export(is_theme_element) +export(is_waiver) export(label_both) export(label_bquote) export(label_context) diff --git a/NEWS.md b/NEWS.md index 4d630967a8..e75e082bcd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -92,7 +92,7 @@ @yutannihilation's prior work, #3120) * When discrete breaks have names, they'll be used as labels by default (@teunbrand, #6147). -* The helper function `is.waiver()` is now exported to help extensions to work +* The helper function `is_waiver()` is now exported to help extensions to work with `waiver()` objects (@arcresu, #6173). * Date(time) scales now throw appropriate errors when `date_breaks`, `date_minor_breaks` or `date_labels` are not strings (@RodDalBen, #5880) diff --git a/R/aes.R b/R/aes.R index de3376071d..33eae1de83 100644 --- a/R/aes.R +++ b/R/aes.R @@ -302,7 +302,7 @@ aes_ <- function(x, y, ...) { caller_env <- parent.frame() as_quosure_aes <- function(x) { - if (is.formula(x) && length(x) == 2) { + if (is_formula(x) && length(x) == 2) { as_quosure(x) } else if (is.null(x) || is.call(x) || is.name(x) || is.atomic(x)) { new_aesthetic(x, caller_env) diff --git a/R/axis-secondary.R b/R/axis-secondary.R index c1d024e288..d694cf3a47 100644 --- a/R/axis-secondary.R +++ b/R/axis-secondary.R @@ -124,19 +124,19 @@ dup_axis <- function(transform = identity, name = derive(), breaks = derive(), sec_axis(transform, trans = trans, name, breaks, labels, guide) } -is.sec_axis <- function(x) { +is_sec_axis <- function(x) { inherits(x, "AxisSecondary") } set_sec_axis <- function(sec.axis, scale) { - if (!is.waiver(sec.axis)) { + if (!is_waiver(sec.axis)) { if (scale$is_discrete()) { if (!identical(.subset2(sec.axis, "trans"), identity)) { cli::cli_abort("Discrete secondary axes must have the {.fn identity} transformation.") } } - if (is.formula(sec.axis)) sec.axis <- sec_axis(sec.axis) - if (!is.sec_axis(sec.axis)) { + if (is_formula(sec.axis)) sec.axis <- sec_axis(sec.axis) + if (!is_sec_axis(sec.axis)) { cli::cli_abort("Secondary axes must be specified using {.fn sec_axis}.") } scale$secondary.axis <- sec.axis @@ -150,7 +150,7 @@ set_sec_axis <- function(sec.axis, scale) { derive <- function() { structure(list(), class = "derived") } -is.derived <- function(x) { +is_derived <- function(x) { inherits(x, "derived") } #' @rdname ggplot2-ggproto @@ -182,9 +182,9 @@ AxisSecondary <- ggproto("AxisSecondary", NULL, if (!is.function(transform)) { cli::cli_abort("Transformation for secondary axes must be a function.") } - if (is.derived(self$name) && !is.waiver(scale$name)) self$name <- scale$name - if (is.derived(self$breaks)) self$breaks <- scale$breaks - if (is.waiver(self$breaks)) { + if (is_derived(self$name) && !is_waiver(scale$name)) self$name <- scale$name + if (is_derived(self$breaks)) self$breaks <- scale$breaks + if (is_waiver(self$breaks)) { if (scale$is_discrete()) { self$breaks <- setNames(nm = scale$get_breaks()) } else { @@ -197,8 +197,8 @@ AxisSecondary <- ggproto("AxisSecondary", NULL, } } } - if (is.derived(self$labels)) self$labels <- scale$labels - if (is.derived(self$guide)) self$guide <- scale$guide + if (is_derived(self$labels)) self$labels <- scale$labels + if (is_derived(self$guide)) self$guide <- scale$guide }, transform_range = function(self, range) { diff --git a/R/coord-radial.R b/R/coord-radial.R index cecef3d9b2..e1ccd1eb67 100644 --- a/R/coord-radial.R +++ b/R/coord-radial.R @@ -576,7 +576,7 @@ deg2rad <- function(deg) deg * pi / 180 # Function to rotate a radius axis through viewport rotate_r_axis <- function(axis, angle, bbox, position = "left") { - if (inherits(axis, "zeroGrob")) { + if (is_zero(axis)) { return(axis) } diff --git a/R/coord-sf.R b/R/coord-sf.R index 12019a64d8..16967cda8c 100644 --- a/R/coord-sf.R +++ b/R/coord-sf.R @@ -116,7 +116,7 @@ CoordSf <- ggproto("CoordSf", CoordCartesian, x_breaks <- graticule$degree[graticule$type == "E"] if (is.null(scale_x$labels)) { x_labels <- rep(NA, length(x_breaks)) - } else if (is.waiver(scale_x$labels)) { + } else if (is_waiver(scale_x$labels)) { x_labels <- graticule$degree_label[graticule$type == "E"] needs_autoparsing[graticule$type == "E"] <- TRUE } else { @@ -141,7 +141,7 @@ CoordSf <- ggproto("CoordSf", CoordCartesian, y_breaks <- graticule$degree[graticule$type == "N"] if (is.null(scale_y$labels)) { y_labels <- rep(NA, length(y_breaks)) - } else if (is.waiver(scale_y$labels)) { + } else if (is_waiver(scale_y$labels)) { y_labels <- graticule$degree_label[graticule$type == "N"] needs_autoparsing[graticule$type == "N"] <- TRUE } else { @@ -335,7 +335,7 @@ CoordSf <- ggproto("CoordSf", CoordCartesian, # we don't draw the graticules if the major panel grid is # turned off - if (inherits(el, "element_blank")) { + if (is_theme_element(el, "blank")) { grobs <- list(element_render(theme, "panel.background")) } else { line_gp <- gg_par( @@ -554,7 +554,7 @@ coord_sf <- function(xlim = NULL, ylim = NULL, expand = TRUE, ndiscr = 100, default = FALSE, clip = "on", reverse = "none") { - if (is.waiver(label_graticule) && is.waiver(label_axes)) { + if (is_waiver(label_graticule) && is_waiver(label_axes)) { # if both `label_graticule` and `label_axes` are set to waive then we # use the default of labels on the left and at the bottom label_graticule <- "" @@ -641,13 +641,13 @@ sf_breaks <- function(scale_x, scale_y, bbox, crs) { bbox[is.na(bbox)] <- c(-180, -90, 180, 90)[is.na(bbox)] } - if (!(is.waiver(scale_x$breaks) && is.null(scale_x$n.breaks))) { + if (!(is_waiver(scale_x$breaks) && is.null(scale_x$n.breaks))) { x_breaks <- scale_x$get_breaks(limits = bbox[c(1, 3)]) finite <- is.finite(x_breaks) x_breaks <- if (any(finite)) x_breaks[finite] else NULL } - if (!(is.waiver(scale_y$breaks) && is.null(scale_y$n.breaks))) { + if (!(is_waiver(scale_y$breaks) && is.null(scale_y$n.breaks))) { y_breaks <- scale_y$get_breaks(limits = bbox[c(2, 4)]) finite <- is.finite(y_breaks) y_breaks <- if (any(finite)) y_breaks[finite] else NULL @@ -770,7 +770,7 @@ view_scales_from_graticule <- function(graticule, scale, aesthetic, if (scale$position != position) { # Try to use secondary axis' guide guide <- scale$secondary.axis$guide %||% waiver() - if (is.derived(guide)) { + if (is_derived(guide)) { guide <- scale$guide } } else { diff --git a/R/facet-grid-.R b/R/facet-grid-.R index 21d3fed9bd..0c0df60bb0 100644 --- a/R/facet-grid-.R +++ b/R/facet-grid-.R @@ -430,7 +430,7 @@ ulevels <- function(x, na.last = TRUE) { table_has_grob <- function(table, pattern) { grobs <- table$grobs[grep(pattern, table$layout$name)] - !all(vapply(grobs, is.zero, logical(1))) + !all(vapply(grobs, is_zero, logical(1))) } seam_table <- function(table, grobs = NULL, side, shift = 1, name, z = 1, diff --git a/R/facet-null.R b/R/facet-null.R index e2c4156aa6..860e5f3b84 100644 --- a/R/facet-null.R +++ b/R/facet-null.R @@ -30,9 +30,9 @@ FacetNull <- ggproto("FacetNull", Facet, layout_null() }, map_data = function(data, layout, params) { - # Need the is.waiver check for special case where no data, but aesthetics + # Need the is_waiver check for special case where no data, but aesthetics # are mapped to vectors - if (is.waiver(data)) + if (is_waiver(data)) return(data_frame0(PANEL = factor())) if (empty(data)) diff --git a/R/facet-wrap.R b/R/facet-wrap.R index 04ac484343..9345fc8a9d 100644 --- a/R/facet-wrap.R +++ b/R/facet-wrap.R @@ -327,7 +327,7 @@ FacetWrap <- ggproto("FacetWrap", Facet, if (length(empty_bottom) > 0) { x_axes <- original$x$bottom[matched[empty_bottom]] clash["bottom"] <- strip == "bottom" && !inside && !free$x && - !all(vapply(x_axes, is.zero, logical(1))) + !all(vapply(x_axes, is_zero, logical(1))) if (!clash["bottom"]) { bottom[empty_bottom] <- x_axes } @@ -336,7 +336,7 @@ FacetWrap <- ggproto("FacetWrap", Facet, if (length(empty_top) > 0) { x_axes <- original$x$top[matched[empty_top]] clash["top"] <- strip == "top" && !inside && !free$x && - !all(vapply(x_axes, is.zero, logical(1))) + !all(vapply(x_axes, is_zero, logical(1))) if (!clash["top"]) { top[empty_top] <- x_axes } @@ -345,7 +345,7 @@ FacetWrap <- ggproto("FacetWrap", Facet, if (length(empty_right) > 0) { y_axes <- original$y$right[matched[empty_right]] clash["right"] <- strip == "right" && !inside && !free$y && - !all(vapply(y_axes, is.zero, logical(1))) + !all(vapply(y_axes, is_zero, logical(1))) if (!clash["right"]) { right[empty_right] <- y_axes } @@ -354,7 +354,7 @@ FacetWrap <- ggproto("FacetWrap", Facet, if (length(empty_left) > 0) { y_axes <- original$y$left[matched[empty_left]] clash["left"] <- strip == "left" && !inside && !free$y && - !all(vapply(y_axes, is.zero, logical(1))) + !all(vapply(y_axes, is_zero, logical(1))) if (!clash["left"]) { left[empty_left] <- y_axes } @@ -410,7 +410,7 @@ FacetWrap <- ggproto("FacetWrap", Facet, if (!inside) { axes <- grepl(paste0("axis-", pos), table$layout$name) - has_axes <- !vapply(table$grobs[axes], is.zero, logical(1)) + has_axes <- !vapply(table$grobs[axes], is_zero, logical(1)) has_axes <- split(has_axes, table$layout[[pos]][axes]) has_axes <- vapply(has_axes, sum, numeric(1)) > 0 padding <- rep(padding, length(has_axes)) diff --git a/R/grob-null.R b/R/grob-null.R index 217c5a7560..da32009b3b 100644 --- a/R/grob-null.R +++ b/R/grob-null.R @@ -23,4 +23,4 @@ grobHeight.zeroGrob <- function(x) unit(0, "cm") #' @method drawDetails zeroGrob drawDetails.zeroGrob <- function(x, recording) {} -is.zero <- function(x) is.null(x) || inherits(x, "zeroGrob") +is_zero <- function(x) is.null(x) || inherits(x, "zeroGrob") diff --git a/R/grouping.R b/R/grouping.R index 80b9d18121..7db4807a0f 100644 --- a/R/grouping.R +++ b/R/grouping.R @@ -12,7 +12,7 @@ add_group <- function(data) { if (empty(data)) return(data) if (is.null(data[["group"]])) { - disc <- vapply(data, is.discrete, logical(1)) + disc <- vapply(data, is_discrete, logical(1)) disc[names(disc) %in% c("label", "PANEL")] <- FALSE if (any(disc)) { diff --git a/R/guide-.R b/R/guide-.R index 63bdedfb87..fe3a65bbca 100644 --- a/R/guide-.R +++ b/R/guide-.R @@ -920,7 +920,7 @@ Guide <- ggproto( #' #' The `gtable` argument with added title. add_title = function(gtable, title, position, just) { - if (is.zero(title)) { + if (is_zero(title)) { return(gtable) } diff --git a/R/guide-axis-logticks.R b/R/guide-axis-logticks.R index 5ca6552967..42caad3ce5 100644 --- a/R/guide-axis-logticks.R +++ b/R/guide-axis-logticks.R @@ -108,7 +108,7 @@ guide_axis_logticks <- function( if (is_bare_numeric(mid)) mid <- rel(mid) if (is_bare_numeric(short)) short <- rel(short) - check_fun <- function(x) (is.rel(x) || is.unit(x)) && length(x) == 1 + check_fun <- function(x) (is_rel(x) || is.unit(x)) && length(x) == 1 what <- "a {.cls rel} or {.cls unit} object of length 1" check_object(long, check_fun, what) check_object(mid, check_fun, what) diff --git a/R/guide-axis-stack.R b/R/guide-axis-stack.R index effa6a5eaf..8a3ba4c91c 100644 --- a/R/guide-axis-stack.R +++ b/R/guide-axis-stack.R @@ -195,7 +195,7 @@ GuideAxisStack <- ggproto( } # Remove empty grobs - grobs <- grobs[!vapply(grobs, is.zero, logical(1))] + grobs <- grobs[!vapply(grobs, is_zero, logical(1))] if (length(grobs) == 0) { return(zeroGrob()) } diff --git a/R/guide-axis-theta.R b/R/guide-axis-theta.R index 8abd11bce1..e5c12e6cd8 100644 --- a/R/guide-axis-theta.R +++ b/R/guide-axis-theta.R @@ -184,7 +184,7 @@ GuideAxisTheta <- ggproto( build_labels = function(key, elements, params) { - if (inherits(elements$text, "element_blank")) { + if (is_theme_element(elements$text, "blank")) { return(zeroGrob()) } @@ -197,7 +197,7 @@ GuideAxisTheta <- ggproto( } # Resolve text angle - if (is.waiver(params$angle) || is.null(params$angle)) { + if (is_waiver(params$angle) || is.null(params$angle)) { angle <- elements$text$angle } else { angle <- flip_text_angle(params$angle - rad2deg(key$theta)) @@ -268,12 +268,12 @@ GuideAxisTheta <- ggproto( key <- params$key key <- vec_slice(key, !is.na(key$.label) & nzchar(key$.label)) labels <- validate_labels(key$.label) - if (length(labels) == 0 || inherits(elements$text, "element_blank")) { + if (length(labels) == 0 || is_theme_element(elements$text, "blank")) { return(list(offset = offset)) } # Resolve text angle - if (is.waiver(params$angle %||% waiver())) { + if (is_waiver(params$angle %||% waiver())) { angle <- elements$text$angle } else { angle <- flip_text_angle(params$angle - rad2deg(key$theta)) @@ -365,7 +365,7 @@ GuideAxisTheta <- ggproto( theta_tickmarks <- function(key, element, length, offset = NULL) { n_breaks <- nrow(key) - if (n_breaks < 1 || inherits(element, "element_blank")) { + if (n_breaks < 1 || is_theme_element(element, "blank")) { return(zeroGrob()) } diff --git a/R/guide-axis.R b/R/guide-axis.R index 53121bbc12..ae1784236f 100644 --- a/R/guide-axis.R +++ b/R/guide-axis.R @@ -263,10 +263,10 @@ GuideAxis <- ggproto( override_elements = function(params, elements, theme) { elements$text <- label_angle_heuristic(elements$text, params$position, params$angle) - if (inherits(elements$ticks, "element_blank")) { + if (is_theme_element(elements$ticks, "blank")) { elements$major_length <- unit(0, "cm") } - if (inherits(elements$minor, "element_blank") || isFALSE(params$minor.ticks)) { + if (is_theme_element(elements$minor, "blank") || isFALSE(params$minor.ticks)) { elements$minor_length <- unit(0, "cm") } return(elements) @@ -383,7 +383,7 @@ GuideAxis <- ggproto( # Ticks major_cm <- convertUnit(elements$major_length, "cm", valueOnly = TRUE) range <- range(0, major_cm) - if (params$minor.ticks && !inherits(elements$minor, "element_blank")) { + if (params$minor.ticks && !is_theme_element(elements$minor, "blank")) { minor_cm <- convertUnit(elements$minor_length, "cm", valueOnly = TRUE) range <- range(range, minor_cm) } @@ -424,7 +424,7 @@ GuideAxis <- ggproto( # Unlist the 'label' grobs z <- if (params$position == "left") c(2, 1, 3) else 1:3 z <- rep(z, c(1, length(grobs$labels), 1)) - has_labels <- !is.zero(grobs$labels[[1]]) + has_labels <- !is_zero(grobs$labels[[1]]) grobs <- c(list(grobs$ticks), grobs$labels, list(grobs$title)) # Initialise empty gtable @@ -594,7 +594,7 @@ axis_label_priority_between <- function(x, y) { #' overridden from the user- or theme-supplied element. #' @noRd label_angle_heuristic <- function(element, position, angle) { - if (!inherits(element, "element_text") + if (!is_theme_element(element, "text") || is.null(position) || is.null(angle %|W|% NULL)) { return(element) diff --git a/R/guide-bins.R b/R/guide-bins.R index d8fed79e42..d62d7af67b 100644 --- a/R/guide-bins.R +++ b/R/guide-bins.R @@ -341,7 +341,7 @@ GuideBins <- ggproto( parse_binned_breaks <- function(scale, breaks = scale$get_breaks()) { - if (is.waiver(scale$labels) || is.function(scale$labels)) { + if (is_waiver(scale$labels) || is.function(scale$labels)) { breaks <- breaks[!is.na(breaks)] } if (length(breaks) == 0) { diff --git a/R/guide-custom.R b/R/guide-custom.R index 12bd9705ad..c16260265e 100644 --- a/R/guide-custom.R +++ b/R/guide-custom.R @@ -96,7 +96,7 @@ GuideCustom <- ggproto( # Render title params <- replace_null(params, position = position, direction = direction) elems <- GuideLegend$setup_elements(params, self$elements, theme) - if (!is.waiver(params$title) && !is.null(params$title)) { + if (!is_waiver(params$title) && !is.null(params$title)) { title <- self$build_title(params$title, elems, params) } else { title <- zeroGrob() diff --git a/R/guide-legend.R b/R/guide-legend.R index 5fb85d3a95..884b59cbf8 100644 --- a/R/guide-legend.R +++ b/R/guide-legend.R @@ -545,7 +545,7 @@ GuideLegend <- ggproto( gt <- gtable(widths = widths, heights = heights) # Add keys - if (!is.zero(grobs$decor)) { + if (!is_zero(grobs$decor)) { n_key_layers <- params$n_key_layers %||% 1L key_cols <- rep(layout$key_col, each = n_key_layers) key_rows <- rep(layout$key_row, each = n_key_layers) @@ -561,7 +561,7 @@ GuideLegend <- ggproto( ) } - if (!is.zero(grobs$labels)) { + if (!is_zero(grobs$labels)) { gt <- gtable_add_grob( gt, grobs$labels, name = names(labels) %||% @@ -580,7 +580,7 @@ GuideLegend <- ggproto( gt <- gtable_add_padding(gt, unit(elements$padding, "cm")) # Add background - if (!is.zero(elements$background)) { + if (!is_zero(elements$background)) { gt <- gtable_add_grob( gt, elements$background, name = "background", clip = "off", @@ -648,7 +648,7 @@ set_key_size <- function(key, linewidth = NULL, size = NULL, default = NULL) { keep_key_data <- function(key, data, aes, show) { # First, can we exclude based on anything else than actually checking the # data that we should include or drop the key? - if (!is.discrete(key$.value)) { + if (!is_discrete(key$.value)) { return(TRUE) } if (is_named(show)) { diff --git a/R/guides-.R b/R/guides-.R index d96ef16074..2f7cd6d317 100644 --- a/R/guides-.R +++ b/R/guides-.R @@ -492,7 +492,7 @@ Guides <- ggproto( ) grobs <- self$draw(theme, positions, theme$legend.direction) - keep <- !vapply(grobs, is.zero, logical(1), USE.NAMES = FALSE) + keep <- !vapply(grobs, is_zero, logical(1), USE.NAMES = FALSE) grobs <- grobs[keep] if (length(grobs) < 1) { return(zeroGrob()) @@ -590,7 +590,7 @@ Guides <- ggproto( # arguments to collect guides package_box = function(grobs, position, theme) { - if (is.zero(grobs) || length(grobs) == 0) { + if (is_zero(grobs) || length(grobs) == 0) { return(zeroGrob()) } diff --git a/R/guides-grid.R b/R/guides-grid.R index 1b2f1a4a99..9e70adaf37 100644 --- a/R/guides-grid.R +++ b/R/guides-grid.R @@ -30,7 +30,7 @@ guide_grid <- function(theme, panel_params, coord, square = TRUE) { grill <- compact(grill) background <- element_render(theme, "panel.background") - if (!isTRUE(square) && !is.zero(background)) { + if (!isTRUE(square) && !is_zero(background)) { gp <- background$gp background <- data_frame0(x = c(1, 1, -1, -1), y = c(1, -1, -1, 1)) * Inf background <- coord_munch(coord, background, panel_params, is_closed = TRUE) diff --git a/R/labeller.R b/R/labeller.R index 9afd572da0..6d3c1b10ae 100644 --- a/R/labeller.R +++ b/R/labeller.R @@ -296,7 +296,7 @@ as_labeller <- function(x, default = label_value, multi_line = TRUE) { x(labels) } else if (is.function(x)) { default(lapply(labels, x)) - } else if (is.formula(x)) { + } else if (is_formula(x)) { default(lapply(labels, as_function(x))) } else if (is.character(x)) { default(lapply(labels, function(label) x[label])) @@ -546,7 +546,7 @@ build_strip <- function(label_df, labeller, theme, horizontal) { #' #' @noRd assemble_strips <- function(grobs, theme, horizontal = TRUE, clip) { - if (length(grobs) == 0 || is.zero(grobs[[1]])) { + if (length(grobs) == 0 || is_zero(grobs[[1]])) { # Subsets matrix of zeroGrobs to correct length (#4050) grobs <- grobs[seq_len(NROW(grobs))] return(grobs) diff --git a/R/labels.R b/R/labels.R index 27c1e96de6..17374aafbd 100644 --- a/R/labels.R +++ b/R/labels.R @@ -189,7 +189,7 @@ labs <- function(..., title = waiver(), subtitle = waiver(), caption = waiver(), tag = tag, alt = allow_lambda(alt), alt_insight = alt_insight, dictionary = dictionary, .ignore_empty = "all") - is_waive <- vapply(args, is.waiver, logical(1)) + is_waive <- vapply(args, is_waiver, logical(1)) args <- args[!is_waive] # remove duplicated arguments args <- args[!duplicated(names(args))] diff --git a/R/layer.R b/R/layer.R index 171dc4631e..0fdeed5a5c 100644 --- a/R/layer.R +++ b/R/layer.R @@ -446,7 +446,7 @@ Layer <- ggproto("Layer", NULL, #' #' A data frame with layer data or `NULL` layer_data = function(self, plot_data) { - if (is.waiver(self$data)) { + if (is_waiver(self$data)) { data <- plot_data } else if (is.function(self$data)) { data <- self$data(plot_data) @@ -456,7 +456,7 @@ Layer <- ggproto("Layer", NULL, } else { data <- self$data } - if (is.null(data) || is.waiver(data)) data else unrowname(data) + if (is.null(data) || is_waiver(data)) data else unrowname(data) }, #' @field setup_layer diff --git a/R/layout.R b/R/layout.R index 88fa8185a3..3149c2ec74 100644 --- a/R/layout.R +++ b/R/layout.R @@ -498,7 +498,7 @@ Layout <- ggproto( primary <- scale$make_title(prim_guide, prim_scale, prim_label) secondary <- scale$make_sec_title(seco_guide, seco_scale, seco_label) - if (is.derived(secondary)) { + if (is_derived(secondary)) { secondary <- primary } @@ -537,7 +537,7 @@ Layout <- ggproto( } else { switch(label, x = ".bottom", y = ".right") } - if (is.null(labels[[label]][[i]]) || is.waiver(labels[[label]][[i]])) + if (is.null(labels[[label]][[i]]) || is_waiver(labels[[label]][[i]])) return(zeroGrob()) element_render( diff --git a/R/plot-build.R b/R/plot-build.R index 24644951c2..9cd01b54d5 100644 --- a/R/plot-build.R +++ b/R/plot-build.R @@ -348,7 +348,7 @@ table_add_tag <- function(table, label, theme) { return(table) } element <- calc_element("plot.tag", theme) - if (inherits(element, "element_blank")) { + if (is_theme_element(element, "blank")) { return(table) } @@ -454,7 +454,7 @@ table_add_tag <- function(table, label, theme) { # Add the legends to the gtable table_add_legends <- function(table, legends, theme) { - if (is.zero(legends)) { + if (is_zero(legends)) { legends <- rep(list(zeroGrob()), 5) names(legends) <- c(.trbl, "inside") } @@ -465,7 +465,7 @@ table_add_legends <- function(table, legends, theme) { names(legends) ) - empty <- vapply(legends, is.zero, logical(1)) + empty <- vapply(legends, is_zero, logical(1)) widths[!empty] <- lapply(legends[!empty], gtable_width) heights[!empty] <- lapply(legends[!empty], gtable_height) spacing <- calc_element("legend.box.spacing", theme) %||% unit(0.2, "cm") diff --git a/R/quick-plot.R b/R/quick-plot.R index 64e2ab460d..4dfa478be3 100644 --- a/R/quick-plot.R +++ b/R/quick-plot.R @@ -121,7 +121,7 @@ qplot <- function(x, y, ..., data, facets = NULL, margins = FALSE, geom[geom == "auto"] <- "qq" } else if (missing(y)) { x <- eval_tidy(mapping$x, data, caller_env) - if (is.discrete(x)) { + if (is_discrete(x)) { geom[geom == "auto"] <- "bar" } else { geom[geom == "auto"] <- "histogram" @@ -139,7 +139,7 @@ qplot <- function(x, y, ..., data, facets = NULL, margins = FALSE, if (is.null(facets)) { p <- p + facet_null() - } else if (is.formula(facets) && length(facets) == 2) { + } else if (is_formula(facets) && length(facets) == 2) { p <- p + facet_wrap(facets) } else { p <- p + facet_grid(rows = deparse(facets), margins = margins) diff --git a/R/scale-.R b/R/scale-.R index cf169cd19e..77d01f6bad 100644 --- a/R/scale-.R +++ b/R/scale-.R @@ -228,7 +228,7 @@ discrete_scale <- function(aesthetics, scale_name = deprecated(), palette, name labels <- allow_lambda(labels) minor_breaks <- allow_lambda(minor_breaks) - if (!is.function(limits) && (length(limits) > 0) && !is.discrete(limits)) { + if (!is.function(limits) && (length(limits) > 0) && !is_discrete(limits)) { cli::cli_warn(c( "Continuous limits supplied to discrete scale.", "i" = "Did you mean {.code limits = factor(...)} or {.fn scale_*_continuous}?" @@ -1117,7 +1117,7 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale, b <- b[is.finite(b)] transformation <- self$get_transformation() - if (is.waiver(self$minor_breaks)) { + if (is_waiver(self$minor_breaks)) { if (is.null(b)) { breaks <- NULL } else { @@ -1164,7 +1164,7 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale, ) } - if (is.waiver(self$labels)) { + if (is_waiver(self$labels)) { labels <- transformation$format(breaks) } else if (is.function(self$labels)) { labels <- self$labels(breaks) @@ -1338,7 +1338,7 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale, return(NULL) } - if (is.waiver(self$breaks)) { + if (is_waiver(self$breaks)) { breaks <- limits } else if (is.function(self$breaks)) { breaks <- self$breaks(limits) @@ -1402,7 +1402,7 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale, ) } - if (is.waiver(labels)) { + if (is_waiver(labels)) { if (!is.null(names(breaks))) { labels <- names(breaks) } else if (is.numeric(breaks)) { @@ -1554,7 +1554,7 @@ ScaleBinned <- ggproto("ScaleBinned", Scale, if (is.null(self$breaks)) { return(NULL) - } else if (is.waiver(self$breaks)) { + } else if (is_waiver(self$breaks)) { if (self$nice.breaks) { if (!is.null(self$n.breaks) && support_nbreaks(transformation$breaks)) { breaks <- transformation$breaks(limits, n = self$n.breaks) @@ -1656,7 +1656,7 @@ ScaleBinned <- ggproto("ScaleBinned", Scale, "Invalid {.arg labels} specification. Use {.code NULL}, not {.code NA}.", call = self$call ) - } else if (is.waiver(self$labels)) { + } else if (is_waiver(self$labels)) { labels <- transformation$format(breaks) } else if (is.function(self$labels)) { labels <- self$labels(breaks) diff --git a/R/scale-continuous.R b/R/scale-continuous.R index 14d7c8e725..8da2f94428 100644 --- a/R/scale-continuous.R +++ b/R/scale-continuous.R @@ -149,21 +149,21 @@ ScaleContinuousPosition <- ggproto("ScaleContinuousPosition", ScaleContinuous, }, break_info = function(self, range = NULL) { breaks <- ggproto_parent(ScaleContinuous, self)$break_info(range) - if (!(is.waiver(self$secondary.axis) || self$secondary.axis$empty())) { + if (!(is_waiver(self$secondary.axis) || self$secondary.axis$empty())) { self$secondary.axis$init(self) breaks <- c(breaks, self$secondary.axis$break_info(breaks$range, self)) } breaks }, sec_name = function(self) { - if (is.waiver(self$secondary.axis)) { + if (is_waiver(self$secondary.axis)) { waiver() } else { self$secondary.axis$name } }, make_sec_title = function(self, ...) { - if (!is.waiver(self$secondary.axis)) { + if (!is_waiver(self$secondary.axis)) { self$secondary.axis$make_title(...) } else { ggproto_parent(ScaleContinuous, self)$make_sec_title(...) diff --git a/R/scale-date.R b/R/scale-date.R index 249bf891f8..3e3eda8a0e 100644 --- a/R/scale-date.R +++ b/R/scale-date.R @@ -318,15 +318,15 @@ datetime_scale <- function(aesthetics, transform, trans = deprecated(), if (is.character(breaks)) breaks <- breaks_width(breaks) if (is.character(minor_breaks)) minor_breaks <- breaks_width(minor_breaks) - if (!is.waiver(date_breaks)) { + if (!is_waiver(date_breaks)) { check_string(date_breaks) breaks <- breaks_width(date_breaks) } - if (!is.waiver(date_minor_breaks)) { + if (!is_waiver(date_minor_breaks)) { check_string(date_minor_breaks) minor_breaks <- breaks_width(date_minor_breaks) } - if (!is.waiver(date_labels)) { + if (!is_waiver(date_labels)) { check_string(date_labels) if (transform == "hms") { labels <- label_time(date_labels) @@ -404,21 +404,21 @@ ScaleContinuousDatetime <- ggproto("ScaleContinuousDatetime", ScaleContinuous, }, break_info = function(self, range = NULL) { breaks <- ggproto_parent(ScaleContinuous, self)$break_info(range) - if (!(is.waiver(self$secondary.axis) || self$secondary.axis$empty())) { + if (!(is_waiver(self$secondary.axis) || self$secondary.axis$empty())) { self$secondary.axis$init(self) breaks <- c(breaks, self$secondary.axis$break_info(breaks$range, self)) } breaks }, sec_name = function(self) { - if (is.waiver(self$secondary.axis)) { + if (is_waiver(self$secondary.axis)) { waiver() } else { self$secondary.axis$name } }, make_sec_title = function(self, ...) { - if (!is.waiver(self$secondary.axis)) { + if (!is_waiver(self$secondary.axis)) { self$secondary.axis$make_title(...) } else { ggproto_parent(ScaleContinuous, self)$make_sec_title(...) @@ -458,21 +458,21 @@ ScaleContinuousDate <- ggproto("ScaleContinuousDate", ScaleContinuous, }, break_info = function(self, range = NULL) { breaks <- ggproto_parent(ScaleContinuous, self)$break_info(range) - if (!(is.waiver(self$secondary.axis) || self$secondary.axis$empty())) { + if (!(is_waiver(self$secondary.axis) || self$secondary.axis$empty())) { self$secondary.axis$init(self) breaks <- c(breaks, self$secondary.axis$break_info(breaks$range, self)) } breaks }, sec_name = function(self) { - if (is.waiver(self$secondary.axis)) { + if (is_waiver(self$secondary.axis)) { waiver() } else { self$secondary.axis$name } }, make_sec_title = function(self, ...) { - if (!is.waiver(self$secondary.axis)) { + if (!is_waiver(self$secondary.axis)) { self$secondary.axis$make_title(...) } else { ggproto_parent(ScaleContinuous, self)$make_sec_title(...) diff --git a/R/scale-discrete-.R b/R/scale-discrete-.R index ce1dd893d5..680167b060 100644 --- a/R/scale-discrete-.R +++ b/R/scale-discrete-.R @@ -119,7 +119,7 @@ ScaleDiscretePosition <- ggproto("ScaleDiscretePosition", ScaleDiscrete, continuous_limits = NULL, train = function(self, x) { - if (is.discrete(x)) { + if (is_discrete(x)) { self$range$train(x, drop = self$drop, na.rm = !self$na.translate) } else { self$range_c$train(x) @@ -156,7 +156,7 @@ ScaleDiscretePosition <- ggproto("ScaleDiscretePosition", ScaleDiscrete, if (inherits(x, "AsIs")) { return(x) } - if (is.discrete(x)) { + if (is_discrete(x)) { values <- self$palette(length(limits)) if (!is.numeric(values)) { cli::cli_abort( @@ -185,7 +185,7 @@ ScaleDiscretePosition <- ggproto("ScaleDiscretePosition", ScaleDiscrete, }, sec_name = function(self) { - if (is.waiver(self$secondary.axis)) { + if (is_waiver(self$secondary.axis)) { waiver() } else { self$secondary.axis$name diff --git a/R/scale-expansion.R b/R/scale-expansion.R index 9c682eeaa6..89b8bd06ad 100644 --- a/R/scale-expansion.R +++ b/R/scale-expansion.R @@ -228,7 +228,7 @@ expand_limits_discrete_trans <- function(limits, expand = expansion(0, 0), range_continuous = NULL) { discrete_limits <- NULL if (length(limits) > 0) { - if (is.discrete(limits)) { + if (is_discrete(limits)) { discrete_limits <- c(1, length(limits)) # for backward compatibility } else { discrete_limits <- range(limits) diff --git a/R/scale-manual.R b/R/scale-manual.R index 9f6284361b..87b479e926 100644 --- a/R/scale-manual.R +++ b/R/scale-manual.R @@ -171,7 +171,7 @@ manual_scale <- function(aesthetic, values = NULL, breaks = waiver(), } # order values according to breaks - if (is.vector(values) && is.null(names(values)) && !is.waiver(breaks) && + if (is.vector(values) && is.null(names(values)) && !is_waiver(breaks) && !is.null(breaks) && !is.function(breaks)) { if (length(breaks) <= length(values)) { names(values) <- breaks diff --git a/R/scale-view.R b/R/scale-view.R index a926084cd8..db0b4bcd65 100644 --- a/R/scale-view.R +++ b/R/scale-view.R @@ -45,7 +45,7 @@ view_scale_primary <- function(scale, limits = scale$get_limits(), view_scale_secondary <- function(scale, limits = scale$get_limits(), continuous_range = scale$dimension(limits = limits)) { - if (is.null(scale$secondary.axis) || is.waiver(scale$secondary.axis) || scale$secondary.axis$empty()) { + if (is.null(scale$secondary.axis) || is_waiver(scale$secondary.axis) || scale$secondary.axis$empty()) { # if there is no second axis, return the primary scale with no guide # this guide can be overridden using guides() primary_scale <- view_scale_primary(scale, limits, continuous_range) diff --git a/R/stat-function.R b/R/stat-function.R index 8ea365b708..d0cd7ec512 100644 --- a/R/stat-function.R +++ b/R/stat-function.R @@ -70,7 +70,7 @@ StatFunction <- ggproto("StatFunction", Stat, } } - if (is.formula(fun)) fun <- as_function(fun) + if (is_formula(fun)) fun <- as_function(fun) y_out <- inject(fun(x_trans, !!!args)) if (!is.null(scales$y) && !scales$y$is_discrete()) { diff --git a/R/theme-elements.R b/R/theme-elements.R index 0ab5930dd0..3d367c6da7 100644 --- a/R/theme-elements.R +++ b/R/theme-elements.R @@ -178,25 +178,6 @@ element_text <- function(family = NULL, face = NULL, colour = NULL, ) } -#' @export -#' @param type For testing elements: the type of element to expect. One of -#' `"blank"`, `"rect"`, `"line"` or `"text"`. -#' @rdname is_tests -is_theme_element <- function(x, type = "any") { - switch( - type %||% "any", - any = inherits(x, "element"), - rect = inherits(x, "element_rect"), - line = inherits(x, "element_line"), - text = inherits(x, "element_text"), - blank = inherits(x, "element_blank"), - # TODO: ideally we accept more elements from extensions. We need to - # consider how this will work with S7 classes, where ggplot2 doesn't know - # about the extension's class objects. - FALSE - ) -} - #' @export #' @rdname element element_polygon <- function(fill = NULL, colour = NULL, linewidth = NULL, @@ -272,6 +253,26 @@ element_geom <- function( fill = NULL, colour = NULL ) +#' @export +#' @param type For testing elements: the type of element to expect. One of +#' `"blank"`, `"rect"`, `"line"`, `"text"`, `"polygon"`, `"point"` or `"geom"`. +#' @rdname is_tests +is_theme_element <- function(x, type = "any") { + switch( + type %||% "any", + any = inherits(x, "element"), + rect = inherits(x, "element_rect"), + line = inherits(x, "element_line"), + text = inherits(x, "element_text"), + polygon = inherits(x, "element_polygon"), + point = inherits(x, "element_point"), + geom = inherits(x, "element_geom"), + blank = inherits(x, "element_blank"), + # We don't consider elements from extensions + FALSE + ) +} + #' @export print.element <- function(x, ...) utils::str(x) @@ -289,7 +290,7 @@ print.rel <- function(x, ...) print(noquote(paste(x, " *", sep = ""))) #' Reports whether x is a rel object #' @param x An object to test #' @keywords internal -is.rel <- function(x) inherits(x, "rel") +is_rel <- function(x) inherits(x, "rel") #' Render a specified theme element into a grob #' @@ -853,7 +854,7 @@ check_element <- function(el, elname, element_tree, call = caller_env()) { if ("margin" %in% eldef$class) { if (!is.unit(el) && length(el) == 4) cli::cli_abort("The {.var {elname}} theme element must be a {.cls unit} vector of length 4.", call = call) - } else if (!inherits(el, eldef$class) && !inherits(el, "element_blank")) { + } else if (!inherits(el, eldef$class) && !is_theme_element(el, "blank")) { cli::cli_abort("The {.var {elname}} theme element must be a {.cls {eldef$class}} object.", call = call) } invisible() diff --git a/R/theme.R b/R/theme.R index 8ad12765a0..61f6bf75be 100644 --- a/R/theme.R +++ b/R/theme.R @@ -917,9 +917,9 @@ combine_elements <- function(e1, e2) { } # Inheritance of rel objects - if (is.rel(e1)) { + if (is_rel(e1)) { # Both e1 and e2 are rel, give product as another rel - if (is.rel(e2)) { + if (is_rel(e2)) { return(rel(unclass(e1) * unclass(e2))) } # If e2 is a unit/numeric, return modified unit/numeric @@ -959,12 +959,12 @@ combine_elements <- function(e1, e2) { e1[n] <- e2[n] # Calculate relative sizes - if (is.rel(e1$size)) { + if (is_rel(e1$size)) { e1$size <- e2$size * unclass(e1$size) } # Calculate relative linewidth - if (is.rel(e1$linewidth)) { + if (is_rel(e1$linewidth)) { e1$linewidth <- e2$linewidth * unclass(e1$linewidth) } diff --git a/R/utilities.R b/R/utilities.R index 8e6f9d46e9..d4fd0ccef4 100644 --- a/R/utilities.R +++ b/R/utilities.R @@ -12,7 +12,7 @@ scales::alpha } "%|W|%" <- function(a, b) { - if (!is.waiver(a)) a else b + if (!is_waiver(a)) a else b } # Check required aesthetics are present @@ -183,7 +183,7 @@ should_stop <- function(expr) { #' calling function should just use the default value. It is used in certain #' functions to distinguish between displaying nothing (`NULL`) and #' displaying a default value calculated elsewhere (`waiver()`). -#' `is.waiver()` reports whether an object is a waiver. +#' `is_waiver()` reports whether an object is a waiver. #' #' @export #' @keywords internal @@ -192,7 +192,7 @@ waiver <- function() structure(list(), class = "waiver") #' @param x An object to test #' @export #' @rdname waiver -is.waiver <- function(x) inherits(x, "waiver") +is_waiver <- function(x) inherits(x, "waiver") pal_binned <- function(palette) { force(palette) @@ -279,10 +279,10 @@ snake_class <- function(x) { } empty <- function(df) { - is.null(df) || nrow(df) == 0 || ncol(df) == 0 || is.waiver(df) + is.null(df) || nrow(df) == 0 || ncol(df) == 0 || is_waiver(df) } -is.discrete <- function(x) { +is_discrete <- function(x) { is.factor(x) || is.character(x) || is.logical(x) } @@ -316,8 +316,6 @@ compact <- function(x) { x[!null] } -is.formula <- function(x) inherits(x, "formula") - dispatch_args <- function(f, ...) { args <- list(...) formals <- formals(f) diff --git a/man/is.rel.Rd b/man/is_rel.Rd similarity index 86% rename from man/is.rel.Rd rename to man/is_rel.Rd index 67cda26b80..032e84f709 100644 --- a/man/is.rel.Rd +++ b/man/is_rel.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-elements.R -\name{is.rel} -\alias{is.rel} +\name{is_rel} +\alias{is_rel} \title{Reports whether x is a rel object} \usage{ -is.rel(x) +is_rel(x) } \arguments{ \item{x}{An object to test} diff --git a/man/is_tests.Rd b/man/is_tests.Rd index bb0b25e799..b6a5c86da8 100644 --- a/man/is_tests.Rd +++ b/man/is_tests.Rd @@ -70,7 +70,7 @@ is.theme(x) # Deprecated \item{x}{An object to test} \item{type}{For testing elements: the type of element to expect. One of -\code{"blank"}, \code{"rect"}, \code{"line"} or \code{"text"}.} +\code{"blank"}, \code{"rect"}, \code{"line"}, \code{"text"}, \code{"polygon"}, \code{"point"} or \code{"geom"}.} } \description{ Reports wether \code{x} is a type of object diff --git a/man/waiver.Rd b/man/waiver.Rd index 88fa06ba57..c1ecfe37bb 100644 --- a/man/waiver.Rd +++ b/man/waiver.Rd @@ -2,12 +2,12 @@ % Please edit documentation in R/utilities.R \name{waiver} \alias{waiver} -\alias{is.waiver} +\alias{is_waiver} \title{A waiver object.} \usage{ waiver() -is.waiver(x) +is_waiver(x) } \arguments{ \item{x}{An object to test} @@ -17,6 +17,6 @@ A waiver is a "flag" object, similar to \code{NULL}, that indicates the calling function should just use the default value. It is used in certain functions to distinguish between displaying nothing (\code{NULL}) and displaying a default value calculated elsewhere (\code{waiver()}). -\code{is.waiver()} reports whether an object is a waiver. +\code{is_waiver()} reports whether an object is a waiver. } \keyword{internal} diff --git a/tests/testthat/test-guide-legend.R b/tests/testthat/test-guide-legend.R index cd2311ee93..de9fdb38ab 100644 --- a/tests/testthat/test-guide-legend.R +++ b/tests/testthat/test-guide-legend.R @@ -5,7 +5,7 @@ test_that("show.legend handles named vectors", { g <- ggplotGrob(p) gb <- grep("guide-box", g$layout$name) n <- vapply(g$grobs[gb], function(x) { - if (is.zero(x)) return(0) + if (is_zero(x)) return(0) length(x$grobs) - 1 }, numeric(1)) sum(n) diff --git a/tests/testthat/test-guides.R b/tests/testthat/test-guides.R index 1a3a31143a..64391776e3 100644 --- a/tests/testthat/test-guides.R +++ b/tests/testthat/test-guides.R @@ -159,7 +159,7 @@ test_that("empty guides are dropped", { guides <- p$plot$guides$assemble(theme_gray()) # All guide-boxes should be empty - expect_true(is.zero(guides)) + expect_true(is_zero(guides)) }) test_that("bins can be parsed by guides for all scale types", {