markfairbanks / tidytable

Tidy interface to 'data.table'
https://markfairbanks.github.io/tidytable/
Other
449 stars 33 forks source link

pmap() doesn't name list elements using existing names #809

Closed kyrantgs closed 2 months ago

kyrantgs commented 4 months ago

I have a use case where I need to pass in a named list with named list elements to pmap. Using purrr::pmap(), the output is named according to the list elements but this is not the case with tidytable::pmap().

library(tidytable)

purrr::pmap(
  list(
    my_list = 
      list(
        group_a = c(1, 5),
        group_b = c(1, 3)
      )
  ),
  function(my_list) {
    sum(my_list) 
  }
)
#> $group_a
#> [1] 6
#> 
#> $group_b
#> [1] 4

tidytable::pmap(
  list(
    my_list = 
      list(
        group_a = c(1, 5),
        group_b = c(1, 3)
      )
  ),
  function(my_list) {
    sum(my_list) 
  }
)
#> [[1]]
#> [1] 6
#> 
#> [[2]]
#> [1] 4

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

Session info ``` r sessioninfo::session_info() #> ─ Session info ─────────────────────────────────────────────────────────────── #> setting value #> version R version 4.3.3 (2024-02-29 ucrt) #> os Windows 10 x64 (build 19045) #> system x86_64, mingw32 #> ui RTerm #> language (EN) #> date 2024-05-14 #> #> ─ Packages ─────────────────────────────────────────────────────────────────── #> package * version date (UTC) lib source #> cli 3.6.2 2023-12-11 [1] CRAN (R 4.3.3) #> data.table 1.15.4 2024-03-30 [1] CRAN (R 4.3.3) #> digest 0.6.35 2024-03-11 [1] CRAN (R 4.3.3) #> evaluate 0.23 2023-11-01 [1] CRAN (R 4.3.3) #> fansi 1.0.6 2023-12-08 [1] CRAN (R 4.3.3) #> fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.3) #> fs 1.6.4 2024-04-25 [1] CRAN (R 4.3.3) #> glue 1.7.0 2024-01-09 [1] CRAN (R 4.3.3) #> htmltools 0.5.8.1 2024-04-04 [1] CRAN (R 4.3.3) #> knitr 1.46 2024-04-06 [1] CRAN (R 4.3.3) #> lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.3) #> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.3) #> pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.3) #> purrr 1.0.2 2023-08-10 [1] CRAN (R 4.3.3) #> R.cache 0.16.0 2022-07-21 [1] CRAN (R 4.3.3) #> R.methodsS3 1.8.2 2022-06-13 [1] CRAN (R 4.3.3) #> R.oo 1.26.0 2024-01-24 [1] CRAN (R 4.3.3) #> R.utils 2.12.3 2023-11-18 [1] CRAN (R 4.3.3) #> reprex 2.1.0 2024-01-11 [1] CRAN (R 4.3.3) #> rlang 1.1.3 2024-01-10 [1] CRAN (R 4.3.3) #> rmarkdown 2.26 2024-03-05 [1] CRAN (R 4.3.3) #> rstudioapi 0.16.0 2024-03-24 [1] CRAN (R 4.3.3) #> sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.3) #> styler 1.10.3 2024-04-07 [1] CRAN (R 4.3.3) #> tidyselect 1.2.1 2024-03-11 [1] CRAN (R 4.3.3) #> tidytable * 0.11.0 2024-02-09 [1] CRAN (R 4.3.3) #> utf8 1.2.4 2023-10-22 [1] CRAN (R 4.3.3) #> vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.3) #> withr 3.0.0 2024-01-16 [1] CRAN (R 4.3.3) #> xfun 0.43 2024-03-25 [1] CRAN (R 4.3.3) #> yaml 2.3.8 2023-12-11 [1] CRAN (R 4.3.2) #> #> #> ────────────────────────────────────────────────────────────────────────────── ```
markfairbanks commented 4 months ago

Yep this is doable. It looks like it just assumes the names of the first list passed?

l <- list(
  vals1 = list(a = 1, b = 2),
  vals2 = list(c = 3, d = 4)
)

purrr::pmap(l, ~ .x + .y)
#> $a
#> [1] 4
#> 
#> $b
#> [1] 6

l <- list(
  vals1 = list(1, 2),
  vals2 = list(c = 3, d = 4)
)

purrr::pmap(l, ~ .x + .y)
#> [[1]]
#> [1] 4
#> 
#> [[2]]
#> [1] 6
kyrantgs commented 4 months ago

Thanks, and yes, it does appear to assume the first name. If that is the behaviour/output that people expect from purrr::pmap(), it would be good to replicate in the tidytable version.