From c80dd29dffd17090edd64067dc793b3bb0fe8cfe Mon Sep 17 00:00:00 2001 From: markfairbanks Date: Mon, 26 Feb 2024 13:58:01 -0700 Subject: [PATCH 1/3] Add `prep_expr_sym()` to auto-unpack data frame variables --- R/utils-prep_exprs.R | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/R/utils-prep_exprs.R b/R/utils-prep_exprs.R index be4a4b57..7d336b59 100644 --- a/R/utils-prep_exprs.R +++ b/R/utils-prep_exprs.R @@ -3,8 +3,8 @@ # Replaces these functions with the necessary data.table translations # Adapted from dt_squash found here: https://github.com/tidyverse/dtplyr/blob/master/R/tidyeval.R prep_exprs <- function(x, data, .by = NULL, j = FALSE, dt_env = caller_env(), is_top_level = FALSE) { - x <- lapply(x, prep_expr, data, {{ .by }}, j = j, dt_env = dt_env, TRUE) - list_flatten(x) + out <- lapply(x, prep_expr, data, {{ .by }}, j = j, dt_env = dt_env, TRUE) + list_flatten(out) } prep_expr <- function(x, data, .by = NULL, j = FALSE, dt_env = caller_env(), is_top_level = FALSE) { @@ -12,8 +12,10 @@ prep_expr <- function(x, data, .by = NULL, j = FALSE, dt_env = caller_env(), is_ x <- get_expr(x) } - if (is_symbol(x) || is_atomic(x) || is_null(x)) { + if (is_atomic(x) || is_null(x)) { x + } else if (is_symbol(x)) { + prep_expr_sym(x, data, dt_env) } else if (is_call(x, tidytable_fns)) { # Ignore nested calls to tidytable functions, #505 x @@ -118,7 +120,24 @@ prep_expr_call <- function(x, data, .by = NULL, j = FALSE, dt_env = caller_env() x } else { # Catches case when "$" or "[[" is used but is not using .data pronoun - x[-1] <- lapply(x[-1], prep_expr, data, {{ .by }}, j, dt_env) + x + } +} + +prep_expr_sym <- function(x, data, dt_env) { + data_vars <- names(data) + name <- as_string(x) + if (name %in% data_vars) { + x + } else if (env_has(dt_env, name, inherit = TRUE)) { + val <- eval_bare(x, dt_env) + if (is.data.frame(val)) { + out <- list2(!!!val) + } else { + out <- x + } + out + } else { x } } From e2b97abd0727f0da9186bf1534b22cedb2fac0db Mon Sep 17 00:00:00 2001 From: markfairbanks Date: Mon, 26 Feb 2024 13:58:27 -0700 Subject: [PATCH 2/3] Pass more argments to `prep_exprs()` --- R/slice.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/slice.R b/R/slice.R index 78dc480f..3ab389f0 100644 --- a/R/slice.R +++ b/R/slice.R @@ -55,7 +55,7 @@ slice.tidytable <- function(.df, ..., .by = NULL) { dt_env <- get_dt_env(dots) - dots <- prep_exprs(dots) + dots <- prep_exprs(dots, .df, dt_env = dt_env) .by <- tidyselect_names(.df, {{ .by }}) From d5eee8a545818a54c391ef33ddbe8ef0b098250e Mon Sep 17 00:00:00 2001 From: markfairbanks Date: Mon, 26 Feb 2024 13:58:35 -0700 Subject: [PATCH 3/3] Pass more argments to `prep_expr()` --- R/slice-head-tail.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/slice-head-tail.R b/R/slice-head-tail.R index a42af675..eda48687 100644 --- a/R/slice-head-tail.R +++ b/R/slice-head-tail.R @@ -10,7 +10,7 @@ slice_head.tidytable <- function(.df, n = 5, ..., .by = NULL, by = NULL) { dt_env <- get_dt_env(n) - n <- prep_expr(n) + n <- prep_expr(n, .df, dt_env = dt_env) .by <- tidyselect_names(.df, c({{ .by }}, {{ by }})) @@ -47,7 +47,7 @@ slice_tail.tidytable <- function(.df, n = 5, ..., .by = NULL, by = NULL) { dt_env <- get_dt_env(n) - n <- prep_expr(n) + n <- prep_expr(n, .df, dt_env = dt_env) .by <- tidyselect_names(.df, c({{ .by }}, {{ by }}))