tidyverse / dtplyr

Data table backend for dplyr

Home Page:https://dtplyr.tidyverse.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`across` doesn't handle dynamically created function list

FinYang opened this issue · comments

across doesn't handle a list of functions created inside the across call. See reprex below.

library(dtplyr)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
tibble(a = 1) %>% 
  lazy_dt() %>% 
  mutate(across(a, lapply(1:2, \(x) identity))) %>% 
  as_tibble()
#> Error in `across_funs()`:
#> ! `.fns` argument to dtplyr::across() must be a NULL, a function, formula, or list

Created on 2024-05-07 with reprex v2.1.0

Inside acrosss_funs, a list of functions is identified using call name list, so it wouldn't work with lists of functions created in other way.

} else if (is_call(funs, "list")) {

The creation is evaluated once later, but after the evaluation, it's passed through the same function across_fus, which again ignores the list if it's not a call named list.

} else if (!is.null(env)) {
# Try evaluating once, just in case
funs <- eval(funs, env)
return(across_funs(funs, NULL, j = j, dots = dots, names_spec = NULL, fn = fn))
} else {
abort("`.fns` argument to dtplyr::across() must be a NULL, a function, formula, or list")
}

BTW, is "dtplyr::across" in the error message intentional?

Unfortunately this is a limit of the translation - you need to supply it an explicit list call of what you want to apply

Edit: This was also discussed a little bit here #154 (comment)