Hello, I'm trying to convert a base R inspired higher-order function that groups and finds the mean or median of a column depending on which sub-function is invoked.
In base R, the following works:
sub_function_1 <- function(df, group_vars, summary_vars) {
result <- aggregate(df[[summary_vars]], by = df[group_vars], FUN = mean, na.rm = TRUE)
colnames(result) <- c(group_vars, "mean")
return(result)
}
sub_function_2 <- function(df, group_vars, summary_vars) {
result <- aggregate(df[[summary_vars]], by = df[group_vars], FUN = median, na.rm = TRUE)
colnames(result) <- c(group_vars, "median")
return(result)
}
main_function <- function(df, group_vars, summary_vars, summary_stat) {
if (summary_stat == "mean") {
sub_function_1(df, group_vars, summary_vars)
} else if (summary_stat == "median") {
sub_function_2(df, group_vars, summary_vars)
} else {
stop("Invalid trigger argument. Use 'mean' or 'median'.")
}
}
main_function(df = iris, group_vars = "Species", summary_vars = "Petal.Length", summary_stat = "mean")
But it's tidy evaluation "equivalent" doesn't work and I don't understand why.
sub_function_1 <- function(df, group_vars, summary_vars) {
df %>%
group_by({{ group_vars }}) %>%
summarize(mean = mean({{ summary_vars }}, na.rm = TRUE))
}
sub_function_2 <- function(df, group_vars, summary_vars) {
df %>%
group_by({{ group_vars }}) %>%
summarize(median = median({{ summary_vars }}, na.rm = TRUE))
}
main_function <- function(df, group_vars, summary_vars, summary_stat) {
if (summary_stat == "mean") {
sub_function_1(df, group_vars, summary_vars)
} else if (summary_stat == "median") {
sub_function_2(df, group_vars, summary_vars)
} else {
stop("Invalid trigger argument. Use 'mean' or 'median'.")
}
}
main_function(df = iris, group_vars = "Species", summary_vars = "Petal.Length", summary_stat = "mean")
Could someone please explain what I'm doing wrong. Thanks!