diff --git a/DESCRIPTION b/DESCRIPTION index 61cdaa332..7fbbbe370 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -21,7 +21,7 @@ Imports: cli, collections, DBI, - dplyr (>= 1.1.4), + dplyr (>= 1.1.4.9000), duckdb (>= 0.10.2), glue, jsonlite, diff --git a/R/dplyr-reimplement.R b/R/dplyr-reimplement.R index 2df171f02..ab10dcc98 100644 --- a/R/dplyr-reimplement.R +++ b/R/dplyr-reimplement.R @@ -5,14 +5,19 @@ duckplyr_mutate_keep <- function(out, keep, used, names_new, names_groups) { names <- names(out) - names_keep <- switch(keep, - used = names(used)[used], - unused = names(used)[!used], - none = character(), - abort("Unknown `keep`.", .internal = TRUE) - ) - - names_out <- intersect(names, c(names_new, names_groups, names_keep)) + if (keep == "transmute") { + names_groups <- setdiff(names_groups, names_new) + names_out <- c(names_groups, names_new) + } else { + names_keep <- switch( + keep, + used = names(used)[used], + unused = names(used)[!used], + none = character(), + abort("Unknown `keep`.", .internal = TRUE) + ) + names_out <- intersect(names, c(names_new, names_groups, names_keep)) + } select(out, !!!names_out) } diff --git a/R/mutate.R b/R/mutate.R index 5f7e4bfe5..95887fb57 100644 --- a/R/mutate.R +++ b/R/mutate.R @@ -1,6 +1,6 @@ # Generated by 02-duckplyr_df-methods.R #' @export -mutate.duckplyr_df <- function(.data, ..., .by = NULL, .keep = c("all", "used", "unused", "none"), .before = NULL, .after = NULL) { +mutate.duckplyr_df <- function(.data, ..., .by = NULL, .keep = c("all", "used", "unused", "none", "transmute"), .before = NULL, .after = NULL) { by_arg <- enquo(.by) keep <- arg_match(.keep) @@ -55,6 +55,7 @@ mutate.duckplyr_df <- function(.data, ..., .by = NULL, .keep = c("all", "used", out <- mutate_relocate( out = out, + keep = keep, before = {{ .before }}, after = {{ .after }}, names_original = names_original @@ -81,7 +82,7 @@ mutate.duckplyr_df <- function(.data, ..., .by = NULL, .keep = c("all", "used", return(out) # dplyr implementation - keep <- arg_match0(.keep, values = c("all", "used", "unused", "none")) + keep <- arg_match0(.keep, values = c("all", "used", "unused", "none", "transmute")) by <- compute_by({{ .by }}, .data, by_arg = ".by", data_arg = ".data") @@ -94,6 +95,7 @@ mutate.duckplyr_df <- function(.data, ..., .by = NULL, .keep = c("all", "used", out <- mutate_relocate( out = out, + keep = keep, before = {{ .before }}, after = {{ .after }}, names_original = names_original