tidyverse / dtplyr

Data table backend for dplyr
https://dtplyr.tidyverse.org
Other
664 stars 58 forks source link

`across` doesn't handle dynamically created function list #471

Closed FinYang closed 4 months ago

FinYang commented 4 months ago

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. https://github.com/tidyverse/dtplyr/blob/82aee6bb6d4000482a1360204252038d02542228/R/tidyeval-across.R#L42

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. https://github.com/tidyverse/dtplyr/blob/82aee6bb6d4000482a1360204252038d02542228/R/tidyeval-across.R#L46-L52

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

markfairbanks commented 4 months ago

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 https://github.com/tidyverse/dtplyr/issues/154#issuecomment-778163153