Skip to content

unnest_wider() fails when list columns have additional classes and missing values #1327

@allenbaron

Description

@allenbaron

I recently upgraded from 1.1.4 to 1.2.0 and ran into an error with unnest_wider(). It now fails with a type conversion error when two occurrences overlap:

  1. the list column to be unnested is composed of list(s) with at least one empty object (NULL or list()).
  2. the list column to be unnested is composed of list(s) with an additional class.
library(tidyr)
#> Warning: package 'tidyr' was built under R version 4.1.2
library(tibble)

x <- list(a = 1, b = NULL)
df <- tibble::tibble(c = 1, d = list(x))
str(df)
#> tibble [1 × 2] (S3: tbl_df/tbl/data.frame)
#>  $ c: num 1
#>  $ d:List of 1
#>   ..$ :List of 2
#>   .. ..$ a: num 1
#>   .. ..$ b: NULL


# works
tidyr::unnest_wider(df, d)
#> # A tibble: 1 × 3
#>       c     a b    
#>   <dbl> <dbl> <lgl>
#> 1     1     1 NA


# does not work
class(x) <- c("fake", "list")
df <- tibble::tibble(c = 1, d = list(x))
tidyr::unnest_wider(df, d)
#> Error: Can't convert <list> to <fake>.


# works again
x$b <- 1
df <- tibble::tibble(c = 1, d = list(x))
tidyr::unnest_wider(df, d)
#> # A tibble: 1 × 3
#>       c     a     b
#>   <dbl> <dbl> <dbl>
#> 1     1     1     1

Created on 2022-02-25 by the reprex package (v2.0.1)

rlang::last_error()
rlang::last_error()
#> <error/vctrs_error_incompatible_type>
#> Can't convert <list> to <fake>.
#> Backtrace:
#>   1. tidyr::unnest_wider(df, d)
#>   2. tidyr:::df_simplify(...)
#>   3. tidyr:::col_simplify(...)
#>   4. tidyr:::list_init_empty(x, null = TRUE, typed = TRUE)
#>   5. vctrs::vec_assign(x, empty_null, replacement)
#>   7. vctrs::vec_default_cast(...)
#>   8. vctrs::stop_incompatible_cast(...)
#>   9. vctrs::stop_incompatible_type(...)
#>  10. vctrs:::stop_incompatible(...)
#>  11. vctrs:::stop_vctrs(...)
#> Run `rlang::last_trace()` to see the full context.
rlang::last_trace()
rlang::last_trace()
#> <error/vctrs_error_incompatible_type>
#> Can't convert <list> to <fake>.
#> Backtrace:
#>      █
#>   1. └─tidyr::unnest_wider(df, d)
#>   2.   └─tidyr:::df_simplify(...)
#>   3.     └─tidyr:::col_simplify(...)
#>   4.       └─tidyr:::list_init_empty(x, null = TRUE, typed = TRUE)
#>   5.         └─vctrs::vec_assign(x, empty_null, replacement)
#>   6.           └─(function () ...
#>   7.             └─vctrs::vec_default_cast(...)
#>   8.               └─vctrs::stop_incompatible_cast(...)
#>   9.                 └─vctrs::stop_incompatible_type(...)
#>  10.                   └─vctrs:::stop_incompatible(...)
#>  11.                     └─vctrs:::stop_vctrs(...)
Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.1 (2021-08-10)
#>  os       macOS Big Sur 10.16         
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       America/New_York            
#>  date     2022-02-25                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  ! package     * version date       lib source        
#>    assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)
#>    backports     1.2.1   2020-12-09 [1] CRAN (R 4.1.0)
#>  P cli           3.0.1   2021-07-17 [?] CRAN (R 4.1.0)
#>    crayon        1.4.1   2021-02-08 [1] CRAN (R 4.1.0)
#>    DBI           1.1.1   2021-01-15 [1] CRAN (R 4.1.0)
#>    digest        0.6.27  2020-10-24 [1] CRAN (R 4.1.0)
#>  P dplyr         1.0.7   2021-06-18 [?] CRAN (R 4.1.0)
#>    ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)
#>    evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.0)
#>    fansi         0.5.0   2021-05-25 [1] CRAN (R 4.1.0)
#>    fs            1.5.0   2020-07-31 [1] CRAN (R 4.1.0)
#>    generics      0.1.0   2020-10-31 [1] CRAN (R 4.1.0)
#>    glue          1.4.2   2020-08-27 [1] CRAN (R 4.1.0)
#>    highr         0.9     2021-04-16 [1] CRAN (R 4.1.0)
#>    htmltools     0.5.1.1 2021-01-22 [1] CRAN (R 4.1.0)
#>    knitr         1.33    2021-04-24 [1] CRAN (R 4.1.0)
#>    lifecycle     1.0.0   2021-02-15 [1] CRAN (R 4.1.0)
#>    magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.1.0)
#>  P pillar        1.6.2   2021-07-29 [?] CRAN (R 4.1.0)
#>    pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)
#>    purrr         0.3.4   2020-04-17 [1] CRAN (R 4.1.0)
#>  P R6            2.5.1   2021-08-19 [?] CRAN (R 4.1.0)
#>    reprex        2.0.1   2021-08-05 [1] CRAN (R 4.1.0)
#>    rlang         0.4.11  2021-04-30 [1] CRAN (R 4.1.0)
#>    rmarkdown     2.10    2021-08-06 [1] CRAN (R 4.1.0)
#>    rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)
#>    sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.1.0)
#>    stringi       1.7.3   2021-07-16 [1] CRAN (R 4.1.0)
#>    stringr       1.4.0   2019-02-10 [1] CRAN (R 4.1.0)
#>    styler        1.5.1   2021-07-13 [1] CRAN (R 4.1.0)
#>    tibble      * 3.1.3   2021-07-23 [1] CRAN (R 4.1.0)
#>    tidyr       * 1.2.0   2022-02-01 [1] CRAN (R 4.1.2)
#>    tidyselect    1.1.1   2021-04-30 [1] CRAN (R 4.1.0)
#>  P utf8          1.2.2   2021-07-24 [?] CRAN (R 4.1.0)
#>    vctrs         0.3.8   2021-04-29 [1] CRAN (R 4.1.0)
#>    withr         2.4.2   2021-04-18 [1] CRAN (R 4.1.0)
#>    xfun          0.25    2021-08-06 [1] CRAN (R 4.1.0)
#>    yaml          2.2.1   2020-02-01 [1] CRAN (R 4.1.0)
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library
#> 
#>  P ── Loaded and on-disk path mismatch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    featurea feature request or enhancementnesting 🐦nesting, chopping, and packing

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions