From 5b96a99a2041cb9b6609a8e1c5bcf5f57c16a3a6 Mon Sep 17 00:00:00 2001 From: Lorenzo Gaborini Date: Tue, 27 Feb 2024 09:56:27 +0100 Subject: [PATCH] feat: support trailing commas everywhere --- NAMESPACE | 1 + R/element_interactive.R | 6 ++-- R/geom_boxplot_interactive.R | 3 +- R/girafe_options.R | 3 +- R/guide_interactive.R | 3 +- R/labeller_interactive.R | 4 +-- R/layer_interactive.R | 3 +- R/scale_interactive.R | 4 +-- inst/tinytest/test-trailing-comma.R | 48 +++++++++++++++++++++++++++++ 9 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 inst/tinytest/test-trailing-comma.R diff --git a/NAMESPACE b/NAMESPACE index 603b4424..d54c99e8 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -297,6 +297,7 @@ importFrom(rlang,is_scalar_double) importFrom(rlang,is_scalar_integer) importFrom(rlang,is_scalar_logical) importFrom(rlang,is_string) +importFrom(rlang,list2) importFrom(stats,ave) importFrom(stats,complete.cases) importFrom(systemfonts,match_font) diff --git a/R/element_interactive.R b/R/element_interactive.R index 1a9f4e3e..def7f31a 100644 --- a/R/element_interactive.R +++ b/R/element_interactive.R @@ -36,11 +36,12 @@ element_text_interactive <- function(...) element_interactive(element_text, ...) #' Calls a base ggplot2 element function and returns an interactive element. +#' @importFrom rlang list2 #' @noRd element_interactive <- function(element_func, ..., extra_interactive_params = NULL) { - args <- list(...) + args <- list2(...) # We need to get the interactive parameters from the arguments and remove them ipar <- get_default_ipar(extra_interactive_params) ip <- get_interactive_attrs(args, ipar = ipar) @@ -70,6 +71,7 @@ element_interactive <- function(element_func, #' @param label The text for the label (scalar character) #' @param ... any of the [interactive_parameters]. #' @return an interactive label object +#' @inheritParams rlang list2 #' @export #' @examples #' library(ggplot2) @@ -91,7 +93,7 @@ element_interactive <- function(element_func, #' if( interactive() ) print(x) #' @seealso [interactive_parameters], [labeller_interactive()] label_interactive <- function(label, ...) { - dots <- list(...) + dots <- list2(...) ipar <- get_default_ipar(dots$extra_interactive_params) ip <- get_interactive_attrs(dots, ipar = ipar) structure( diff --git a/R/geom_boxplot_interactive.R b/R/geom_boxplot_interactive.R index 0a55e573..f2a46607 100644 --- a/R/geom_boxplot_interactive.R +++ b/R/geom_boxplot_interactive.R @@ -129,9 +129,10 @@ StatInteractiveBoxplot <- ggproto( #' # add interactive boxplot ------- #' @example examples/geom_boxplot_interactive.R #' @seealso [girafe()] +#' @importFrom rlang list2 #' @export geom_boxplot_interactive <- function(...) { - args <- list(...) + args <- list2(...) if ("extra_interactive_params" %in% names(args)) { args$extra_interactive_params <- c(args$extra_interactive_params, outlier_ipar) } else { diff --git a/R/girafe_options.R b/R/girafe_options.R index 92882b41..c24fdc8c 100644 --- a/R/girafe_options.R +++ b/R/girafe_options.R @@ -573,13 +573,14 @@ opts_sizing <- function(rescale = TRUE, width = 1){ #' } #' @export #' @seealso [girafe()], [girafe_css()], [girafe_css_bicolor()] +#' @importFrom rlang list2 #' @family girafe animation options girafe_options <- function(x, ...){ if(!inherits(x, "girafe")) { abort("`x` must be a girafe object", call = NULL) } - args <- list(...) + args <- list2(...) x$x$settings <- merge_options(x$x$settings, args) x$sizingPolicy <- merge_sizing_policy(x$sizingPolicy, args) x diff --git a/R/guide_interactive.R b/R/guide_interactive.R index da62bba4..aa26e458 100644 --- a/R/guide_interactive.R +++ b/R/guide_interactive.R @@ -1,9 +1,10 @@ #' Calls a base guide function and returns an interactive guide. #' @noRd +#' @importFrom rlang list2 guide_interactive <- function(guide_func, ..., interactive_guide = NULL) { - args <- list(...) + args <- list2(...) # Call default guide function if (is.function(guide_func)) { guide <- do.call(guide_func, args) diff --git a/R/labeller_interactive.R b/R/labeller_interactive.R index aa0f448d..adb3f782 100644 --- a/R/labeller_interactive.R +++ b/R/labeller_interactive.R @@ -27,11 +27,11 @@ #' # use interactive labeller #' @example examples/labeller_interactive.R #' @seealso [labeller()], [label_interactive()], [labellers] -#' @importFrom rlang eval_tidy +#' @importFrom rlang eval_tidy list2 #' @importFrom purrr imap labeller_interactive <- function(.mapping = NULL, ...) { # get interactive aesthetics, plus a label parameter - dots <- list(...) + dots <- list2(...) extra_interactive_params <- c(dots$extra_interactive_params, "label") ipar <- get_default_ipar(extra_interactive_params) ip <- get_interactive_attrs(.mapping, ipar = ipar) diff --git a/R/layer_interactive.R b/R/layer_interactive.R index acb39ca4..510ef7c7 100644 --- a/R/layer_interactive.R +++ b/R/layer_interactive.R @@ -1,12 +1,13 @@ #' Calls a base ggplot2 geom/layer function and replaces the geom param #' so that it points to the analogous interactive geom. #' @importFrom purrr detect_index +#' @importFrom rlang list2 #' @noRd layer_interactive <- function(layer_func, ..., interactive_geom = NULL, extra_interactive_params = NULL) { - args <- list(...) + args <- list2(...) # we need to temporarily remove the interactive aesthetics if they exist # we could use check.aes = FALSE and check.param = FALSE but no fun there interactive_mapping <- NULL diff --git a/R/scale_interactive.R b/R/scale_interactive.R index 259cb3b9..507df325 100644 --- a/R/scale_interactive.R +++ b/R/scale_interactive.R @@ -1,10 +1,10 @@ #' Calls a base scale function and returns an interactive scale. #' @noRd -#' @importFrom rlang inherits_any +#' @importFrom rlang inherits_any list2 scale_interactive <- function(scale_func, ..., extra_interactive_params = NULL) { - args <- list(...) + args <- list2(...) # We need to get the interactive parameters from the arguments and remove them ipar <- get_default_ipar(extra_interactive_params) interactive_params <- get_interactive_attrs(args, ipar = ipar) diff --git a/inst/tinytest/test-trailing-comma.R b/inst/tinytest/test-trailing-comma.R new file mode 100644 index 00000000..2d9426a1 --- /dev/null +++ b/inst/tinytest/test-trailing-comma.R @@ -0,0 +1,48 @@ +library(tinytest) +library(ggiraph) +library(ggplot2) + + +# Trailing comma allowed ---- +{ + p <- diamonds |> + ggplot() + + geom_bar_interactive( + mapping = aes( + x = color, + fill = color, + ), + ) + + scale_fill_discrete_interactive( + guide = guide_legend_interactive( + title = "Color", + position = "bottom", + ), + ) + + facet_wrap_interactive(vars(cut), ) + + annotate_interactive("text", x = "E", y = 1, label = "E", color = "red", vjust = "bottom", ) + + labs( + title = label_interactive("Title",) + ) + + theme( + plot.title = element_text_interactive(tooltip = "Plot title",) + ) + + g <- girafe(code = print(p)) + expect_inherits(g, c("ggiraph", "girafe", "htmlwidget")) + +} + +# girafe, trailing comma ---- +{ + g <- girafe(ggobj = ggplot(),) + expect_inherits(g, c("girafe", "htmlwidget")) +} + +# girafe_options, trailing comma ---- +{ + g <- girafe({ + NULL + }) + expect_identical(girafe_options(g, ), g, info = "no options set") +}