Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Implement almost all dplyr methods #105

Merged
merged 5 commits into from
Mar 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,22 @@ S3method(explain,duckplyr_df)
S3method(full_join,duckplyr_df)
S3method(group_by,duckplyr_df)
S3method(group_data,duckplyr_df)
S3method(group_indices,duckplyr_df)
S3method(group_keys,duckplyr_df)
S3method(group_map,duckplyr_df)
S3method(group_modify,duckplyr_df)
S3method(group_nest,duckplyr_df)
S3method(group_size,duckplyr_df)
S3method(group_split,duckplyr_df)
S3method(group_trim,duckplyr_df)
S3method(group_vars,duckplyr_df)
S3method(groups,duckplyr_df)
S3method(head,duckplyr_df)
S3method(inner_join,duckplyr_df)
S3method(intersect,duckplyr_df)
S3method(left_join,duckplyr_df)
S3method(mutate,duckplyr_df)
S3method(n_groups,duckplyr_df)
S3method(nest_by,duckplyr_df)
S3method(nest_join,duckplyr_df)
S3method(print,relational_relexpr)
Expand Down Expand Up @@ -252,12 +257,15 @@ importFrom(dplyr,funs_)
importFrom(dplyr,group_by)
importFrom(dplyr,group_by_prepare)
importFrom(dplyr,group_data)
importFrom(dplyr,group_indices)
importFrom(dplyr,group_keys)
importFrom(dplyr,group_map)
importFrom(dplyr,group_modify)
importFrom(dplyr,group_nest)
importFrom(dplyr,group_rows)
importFrom(dplyr,group_size)
importFrom(dplyr,group_split)
importFrom(dplyr,group_trim)
importFrom(dplyr,group_vars)
importFrom(dplyr,group_walk)
importFrom(dplyr,grouped_df)
Expand All @@ -276,6 +284,7 @@ importFrom(dplyr,mutate)
importFrom(dplyr,mutate_all)
importFrom(dplyr,n)
importFrom(dplyr,n_distinct)
importFrom(dplyr,n_groups)
importFrom(dplyr,nest_by)
importFrom(dplyr,nest_join)
importFrom(dplyr,nth)
Expand Down
2 changes: 2 additions & 0 deletions R/dplyr.R
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ ensure_group_vars <- dplyr$ensure_group_vars
env_bind_do_pronouns <- dplyr$env_bind_do_pronouns
filter_rows <- dplyr$filter_rows
groups <- dplyr$groups
group_nest_impl <- dplyr$group_nest_impl
group_split_impl <- dplyr$group_split_impl
join_cast_common <- dplyr$join_cast_common
join_filter <- dplyr$join_filter
join_mutate <- dplyr$join_mutate
Expand Down
4 changes: 4 additions & 0 deletions R/duckplyr-package.R
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,13 @@
#' @importFrom collections dict
#' @importFrom collections queue
#' @importFrom dplyr group_by_prepare
#' @importFrom dplyr group_indices
#' @importFrom dplyr group_nest
#' @importFrom dplyr group_split
#' @importFrom dplyr group_trim
#' @importFrom dplyr grouped_df
#' @importFrom dplyr if_else
#' @importFrom dplyr n_groups
#' @importFrom glue glue
#' @importFrom lifecycle deprecated
#' @importFrom tibble as_tibble
Expand Down
41 changes: 41 additions & 0 deletions R/group_indices.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by 02-duckplyr_df-methods.R
#' @export
group_indices.duckplyr_df <- function(.data, ...) {
# Our implementation
rel_try(
# Always fall back to dplyr
"No relational implementation for group_indices()" = TRUE,
{
return(out)
}
)

# dplyr forward
group_indices <- dplyr$group_indices.data.frame
out <- group_indices(.data, ...)
return(out)

# dplyr implementation
if (dots_n(...) > 0) {
lifecycle::deprecate_warn(
"1.0.0", "group_indices(... = )",
details = "Please `group_by()` first",
always = TRUE
)
.data <- group_by(.data, ...)
}

# .Call(`dplyr_group_indices`, .data, group_rows(.data))
}

duckplyr_group_indices <- function(.data, ...) {
try_fetch(
.data <- as_duckplyr_df(.data),
error = function(e) {
testthat::skip(conditionMessage(e))
}
)
out <- group_indices(.data, ...)
class(out) <- setdiff(class(out), "duckplyr_df")
out
}
36 changes: 36 additions & 0 deletions R/group_nest.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by 02-duckplyr_df-methods.R
#' @export
group_nest.duckplyr_df <- function(.tbl, ..., .key = "data", keep = FALSE) {
# Our implementation
rel_try(
# Always fall back to dplyr
"No relational implementation for group_nest()" = TRUE,
{
return(out)
}
)

# dplyr forward
group_nest <- dplyr$group_nest.data.frame
out <- group_nest(.tbl, ..., .key = .key, keep = keep)
return(out)

# dplyr implementation
if (dots_n(...)) {
group_nest_impl(group_by(.tbl, ...), .key = .key, keep = keep)
} else {
tibble(!!.key := list(.tbl))
}
}

duckplyr_group_nest <- function(.tbl, ...) {
try_fetch(
.tbl <- as_duckplyr_df(.tbl),
error = function(e) {
testthat::skip(conditionMessage(e))
}
)
out <- group_nest(.tbl, ...)
class(out) <- setdiff(class(out), "duckplyr_df")
out
}
37 changes: 37 additions & 0 deletions R/group_split.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by 02-duckplyr_df-methods.R
#' @export
group_split.duckplyr_df <- function(.tbl, ..., .keep = TRUE, keep = deprecated()) {
# Our implementation
rel_try(
# Always fall back to dplyr
"No relational implementation for group_split()" = TRUE,
{
return(out)
}
)

# dplyr forward
group_split <- dplyr$group_split.data.frame
out <- group_split(.tbl, ..., .keep = .keep, keep = keep)
return(out)

# dplyr implementation
if (!missing(keep)) {
lifecycle::deprecate_warn("1.0.0", "group_split(keep = )", "group_split(.keep = )", always = TRUE)
.keep <- keep
}
data <- group_by(.tbl, ...)
group_split_impl(data, .keep = .keep)
}

duckplyr_group_split <- function(.tbl, ...) {
try_fetch(
.tbl <- as_duckplyr_df(.tbl),
error = function(e) {
testthat::skip(conditionMessage(e))
}
)
out <- group_split(.tbl, ...)
class(out) <- setdiff(class(out), "duckplyr_df")
out
}
32 changes: 32 additions & 0 deletions R/group_trim.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by 02-duckplyr_df-methods.R
#' @export
group_trim.duckplyr_df <- function(.tbl, .drop = group_by_drop_default(.tbl)) {
# Our implementation
rel_try(
# Always fall back to dplyr
"No relational implementation for group_trim()" = TRUE,
{
return(out)
}
)

# dplyr forward
group_trim <- dplyr$group_trim.data.frame
out <- group_trim(.tbl, .drop)
return(out)

# dplyr implementation
.tbl
}

duckplyr_group_trim <- function(.tbl, ...) {
try_fetch(
.tbl <- as_duckplyr_df(.tbl),
error = function(e) {
testthat::skip(conditionMessage(e))
}
)
out <- group_trim(.tbl, ...)
class(out) <- setdiff(class(out), "duckplyr_df")
out
}
32 changes: 32 additions & 0 deletions R/n_groups.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by 02-duckplyr_df-methods.R
#' @export
n_groups.duckplyr_df <- function(x) {
# Our implementation
rel_try(
# Always fall back to dplyr
"No relational implementation for n_groups()" = TRUE,
{
return(out)
}
)

# dplyr forward
n_groups <- dplyr$n_groups.data.frame
out <- n_groups(x)
return(out)

# dplyr implementation
nrow(group_data(x))
}

duckplyr_n_groups <- function(x, ...) {
try_fetch(
x <- as_duckplyr_df(x),
error = function(e) {
testthat::skip(conditionMessage(e))
}
)
out <- n_groups(x, ...)
class(out) <- setdiff(class(out), "duckplyr_df")
out
}
5 changes: 5 additions & 0 deletions R/overwrite.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,21 @@ methods_overwrite <- function() {
vctrs::s3_register("dplyr::full_join", "data.frame", full_join.duckplyr_df)
vctrs::s3_register("dplyr::group_by", "data.frame", group_by.duckplyr_df)
vctrs::s3_register("dplyr::group_data", "data.frame", group_data.duckplyr_df)
vctrs::s3_register("dplyr::group_indices", "data.frame", group_indices.duckplyr_df)
vctrs::s3_register("dplyr::group_keys", "data.frame", group_keys.duckplyr_df)
vctrs::s3_register("dplyr::group_map", "data.frame", group_map.duckplyr_df)
vctrs::s3_register("dplyr::group_modify", "data.frame", group_modify.duckplyr_df)
vctrs::s3_register("dplyr::group_nest", "data.frame", group_nest.duckplyr_df)
vctrs::s3_register("dplyr::group_size", "data.frame", group_size.duckplyr_df)
vctrs::s3_register("dplyr::group_split", "data.frame", group_split.duckplyr_df)
vctrs::s3_register("dplyr::group_trim", "data.frame", group_trim.duckplyr_df)
vctrs::s3_register("dplyr::group_vars", "data.frame", group_vars.duckplyr_df)
vctrs::s3_register("dplyr::groups", "data.frame", groups.duckplyr_df)
vctrs::s3_register("dplyr::inner_join", "data.frame", inner_join.duckplyr_df)
vctrs::s3_register("dplyr::intersect", "data.frame", intersect.duckplyr_df)
vctrs::s3_register("dplyr::left_join", "data.frame", left_join.duckplyr_df)
vctrs::s3_register("dplyr::mutate", "data.frame", mutate.duckplyr_df)
vctrs::s3_register("dplyr::n_groups", "data.frame", n_groups.duckplyr_df)
vctrs::s3_register("dplyr::nest_by", "data.frame", nest_by.duckplyr_df)
vctrs::s3_register("dplyr::nest_join", "data.frame", nest_join.duckplyr_df)
vctrs::s3_register("dplyr::pull", "data.frame", pull.duckplyr_df)
Expand Down
5 changes: 5 additions & 0 deletions R/restore.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,21 @@ methods_restore <- function() {
vctrs::s3_register("dplyr::full_join", "data.frame", dplyr$full_join.data.frame)
vctrs::s3_register("dplyr::group_by", "data.frame", dplyr$group_by.data.frame)
vctrs::s3_register("dplyr::group_data", "data.frame", dplyr$group_data.data.frame)
vctrs::s3_register("dplyr::group_indices", "data.frame", dplyr$group_indices.data.frame)
vctrs::s3_register("dplyr::group_keys", "data.frame", dplyr$group_keys.data.frame)
vctrs::s3_register("dplyr::group_map", "data.frame", dplyr$group_map.data.frame)
vctrs::s3_register("dplyr::group_modify", "data.frame", dplyr$group_modify.data.frame)
vctrs::s3_register("dplyr::group_nest", "data.frame", dplyr$group_nest.data.frame)
vctrs::s3_register("dplyr::group_size", "data.frame", dplyr$group_size.data.frame)
vctrs::s3_register("dplyr::group_split", "data.frame", dplyr$group_split.data.frame)
vctrs::s3_register("dplyr::group_trim", "data.frame", dplyr$group_trim.data.frame)
vctrs::s3_register("dplyr::group_vars", "data.frame", dplyr$group_vars.data.frame)
vctrs::s3_register("dplyr::groups", "data.frame", dplyr$groups.data.frame)
vctrs::s3_register("dplyr::inner_join", "data.frame", dplyr$inner_join.data.frame)
vctrs::s3_register("dplyr::intersect", "data.frame", dplyr$intersect.data.frame)
vctrs::s3_register("dplyr::left_join", "data.frame", dplyr$left_join.data.frame)
vctrs::s3_register("dplyr::mutate", "data.frame", dplyr$mutate.data.frame)
vctrs::s3_register("dplyr::n_groups", "data.frame", dplyr$n_groups.data.frame)
vctrs::s3_register("dplyr::nest_by", "data.frame", dplyr$nest_by.data.frame)
vctrs::s3_register("dplyr::nest_join", "data.frame", dplyr$nest_join.data.frame)
vctrs::s3_register("dplyr::pull", "data.frame", dplyr$pull.data.frame)
Expand Down
12 changes: 12 additions & 0 deletions dplyr-methods/group_indices.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
group_indices.data.frame <- function(.data, ...) {
if (dots_n(...) > 0) {
lifecycle::deprecate_warn(
"1.0.0", "group_indices(... = )",
details = "Please `group_by()` first",
always = TRUE
)
.data <- group_by(.data, ...)
}

.Call(`dplyr_group_indices`, .data, group_rows(.data))
}
7 changes: 7 additions & 0 deletions dplyr-methods/group_nest.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
group_nest.data.frame <- function(.tbl, ..., .key = "data", keep = FALSE) {
if (dots_n(...)) {
group_nest_impl(group_by(.tbl, ...), .key = .key, keep = keep)
} else {
tibble(!!.key := list(.tbl))
}
}
8 changes: 8 additions & 0 deletions dplyr-methods/group_split.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
group_split.data.frame <- function(.tbl, ..., .keep = TRUE, keep = deprecated()) {
if (!missing(keep)) {
lifecycle::deprecate_warn("1.0.0", "group_split(keep = )", "group_split(.keep = )", always = TRUE)
.keep <- keep
}
data <- group_by(.tbl, ...)
group_split_impl(data, .keep = .keep)
}
3 changes: 3 additions & 0 deletions dplyr-methods/group_trim.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
group_trim.data.frame <- function(.tbl, .drop = group_by_drop_default(.tbl)) {
.tbl
}
3 changes: 3 additions & 0 deletions dplyr-methods/n_groups.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
n_groups.data.frame <- function(x) {
nrow(group_data(x))
}
13 changes: 13 additions & 0 deletions patch/group_indices.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git b/R/group_indices.R a/R/group_indices.R
index 48bcf3e..6c1bf15 100644
--- b/R/group_indices.R
+++ a/R/group_indices.R
@@ -25,7 +25,7 @@ group_indices.duckplyr_df <- function(.data, ...) {
.data <- group_by(.data, ...)
}

- .Call(`dplyr_group_indices`, .data, group_rows(.data))
+ # .Call(`dplyr_group_indices`, .data, group_rows(.data))
}

duckplyr_group_indices <- function(.data, ...) {
Loading
Loading