From 97ce6d8d8f1fbb0d0147f4d00c42b760245d59a9 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Wed, 3 Jul 2024 11:05:23 +0200 Subject: [PATCH 1/2] move `make_summary_fun()` to `setup_params()` --- R/stat-summary-bin.R | 16 ++++++++++------ R/stat-summary.R | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/R/stat-summary-bin.R b/R/stat-summary-bin.R index ce57b6def9..c6405c3f55 100644 --- a/R/stat-summary-bin.R +++ b/R/stat-summary-bin.R @@ -64,24 +64,28 @@ stat_summary_bin <- function(mapping = NULL, data = NULL, StatSummaryBin <- ggproto("StatSummaryBin", Stat, required_aes = c("x", "y"), - extra_params = c("na.rm", "orientation"), + extra_params = c("na.rm", "orientation", "fun.data", "fun.max", "fun.min", "fun.args"), + setup_params = function(data, params) { - params$flipped_aes <- has_flipped_aes(data, params, ambiguous = TRUE) + params$flipped_aes <- has_flipped_aes(data, params) + params$fun <- make_summary_fun( + params$fun.data, params$fun, + params$fun.max, params$fun.min, + params$fun.args %||% list() + ) params }, - compute_group = function(data, scales, fun.data = NULL, fun = NULL, - fun.max = NULL, fun.min = NULL, fun.args = list(), + compute_group = function(data, scales, fun = NULL, bins = 30, binwidth = NULL, breaks = NULL, origin = NULL, right = FALSE, na.rm = FALSE, flipped_aes = FALSE) { data <- flip_data(data, flipped_aes) - fun <- make_summary_fun(fun.data, fun, fun.max, fun.min, fun.args) x <- flipped_names(flipped_aes)$x breaks <- bin2d_breaks(scales[[x]], breaks, origin, binwidth, bins, right = right) data$bin <- cut(data$x, breaks, include.lowest = TRUE, labels = FALSE) - out <- dapply(data, "bin", fun) + out <- dapply(data, "bin", fun %||% function(df) mean_se(df$y)) locs <- bin_loc(breaks, out$bin) out$x <- locs$mid diff --git a/R/stat-summary.R b/R/stat-summary.R index ddcb7b5ae3..2cac872dee 100644 --- a/R/stat-summary.R +++ b/R/stat-summary.R @@ -181,18 +181,22 @@ stat_summary <- function(mapping = NULL, data = NULL, StatSummary <- ggproto("StatSummary", Stat, required_aes = c("x", "y"), - extra_params = c("na.rm", "orientation"), + extra_params = c("na.rm", "orientation", "fun.data", "fun.max", "fun.min", "fun.args"), + setup_params = function(data, params) { params$flipped_aes <- has_flipped_aes(data, params) + params$fun <- make_summary_fun( + params$fun.data, params$fun, + params$fun.max, params$fun.min, + params$fun.args %||% list() + ) params }, - compute_panel = function(data, scales, fun.data = NULL, fun = NULL, - fun.max = NULL, fun.min = NULL, fun.args = list(), - na.rm = FALSE, flipped_aes = FALSE) { + compute_panel = function(data, scales, fun = NULL, + na.rm = FALSE, flipped_aes = FALSE) { data <- flip_data(data, flipped_aes) - fun <- make_summary_fun(fun.data, fun, fun.max, fun.min, fun.args) - summarised <- summarise_by_x(data, fun) + summarised <- summarise_by_x(data, fun %||% function(df) mean_se(df$y)) summarised$flipped_aes <- flipped_aes flip_data(summarised, flipped_aes) } From d2eb8a537a9f8aaa27dd9adb62e16a1d5078e3de Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Mon, 26 Aug 2024 13:23:53 +0200 Subject: [PATCH 2/2] add news bullet --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index d553c7f924..948ab92543 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # ggplot2 (development version) +* (internal) The summary function of `stat_summary()` and `stat_summary_bin()` + is setup once in total instead of once per group (@teunbrand, #5971) * `stat_bin()` now accepts functions for argument `breaks` (@aijordan, #4561) * (internal) The plot's layout now has a coord parameter that is used to prevent setting up identical panel parameters (#5427)