vctrs icon indicating copy to clipboard operation
vctrs copied to clipboard

vec_c creates a malformed factor for .ptype = factor()

Open mgirlich opened this issue 4 years ago • 3 comments

It only works if all levels are specified

library(vctrs)
str(vec_c("red", "blue", .ptype = factor()))
#>  Factor w/ 0 levels: 1 1
str(vec_c(factor("red"), factor("blue"), .ptype = factor()))
#>  Factor w/ 0 levels: 1 1

# works
vec_c("red", "blue", .ptype = factor(levels = c("blue", "red")))
#> [1] red  blue
#> Levels: blue red
vec_c(factor("red"), factor("blue"))
#> [1] red  blue
#> Levels: red blue

Created on 2020-07-16 by the reprex package (v0.3.0)

Session info
devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.0.1 (2020-06-06)
#>  os       macOS Catalina 10.15.5      
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       UTC                         
#>  date     2020-07-16                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.0)
#>  backports     1.1.8   2020-06-17 [1] CRAN (R 4.0.1)
#>  callr         3.4.3   2020-03-28 [1] CRAN (R 4.0.0)
#>  cli           2.0.2   2020-02-28 [1] CRAN (R 4.0.0)
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 4.0.0)
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 4.0.0)
#>  devtools      2.3.0   2020-04-10 [1] CRAN (R 4.0.0)
#>  digest        0.6.25  2020-02-23 [1] CRAN (R 4.0.0)
#>  ellipsis      0.3.1   2020-05-15 [1] CRAN (R 4.0.0)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.0)
#>  fansi         0.4.1   2020-01-08 [1] CRAN (R 4.0.0)
#>  fs            1.4.2   2020-06-30 [1] CRAN (R 4.0.1)
#>  glue          1.4.1   2020-05-13 [1] CRAN (R 4.0.0)
#>  highr         0.8     2019-03-20 [1] CRAN (R 4.0.0)
#>  htmltools     0.5.0   2020-06-16 [1] CRAN (R 4.0.1)
#>  knitr         1.29    2020-06-23 [1] CRAN (R 4.0.1)
#>  magrittr      1.5     2014-11-22 [1] CRAN (R 4.0.0)
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 4.0.0)
#>  pkgbuild      1.1.0   2020-07-13 [1] CRAN (R 4.0.1)
#>  pkgload       1.1.0   2020-05-29 [1] CRAN (R 4.0.0)
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.0)
#>  processx      3.4.3   2020-07-05 [1] CRAN (R 4.0.0)
#>  ps            1.3.3   2020-05-08 [1] CRAN (R 4.0.0)
#>  R6            2.4.1   2019-11-12 [1] CRAN (R 4.0.0)
#>  remotes       2.1.1   2020-02-15 [1] CRAN (R 4.0.0)
#>  rlang         0.4.7   2020-07-09 [1] CRAN (R 4.0.1)
#>  rmarkdown     2.3     2020-06-18 [1] CRAN (R 4.0.1)
#>  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 4.0.0)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.0)
#>  stringi       1.4.6   2020-02-17 [1] CRAN (R 4.0.0)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 4.0.0)
#>  testthat      2.3.2   2020-03-02 [1] CRAN (R 4.0.0)
#>  usethis       1.6.1   2020-04-29 [1] CRAN (R 4.0.0)
#>  vctrs       * 0.3.2   2020-07-15 [1] CRAN (R 4.0.1)
#>  withr         2.2.0   2020-04-20 [1] CRAN (R 4.0.0)
#>  xfun          0.15    2020-06-21 [1] CRAN (R 4.0.1)
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.0)
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library

mgirlich avatar Jul 16 '20 08:07 mgirlich

This usage is undefined behaviour at the moment. We treat empty parameterised types as templates in some cases (e.g. data.frame()), but we haven't come up with a general principle for this yet.

lionel- avatar Jul 16 '20 08:07 lionel-

Okay, I think an informative error message would be great. Otherwise one gets an error message that doesn't really help e.g. in tidyr

library(tidyr)
tibble(metadata = list(list(name = "nemo"))) %>% 
  unnest_wider(metadata, ptype = list(name = factor()))
#> Error in as.character.factor(x): malformed factor

Created on 2020-07-16 by the reprex package (v0.3.0)

mgirlich avatar Jul 16 '20 08:07 mgirlich

For tidyr I recommend using the new .transform argument with tried and trusted functions like as.factor() or as.double() by the way.

lionel- avatar Jul 16 '20 13:07 lionel-

This currently works as expected, but hopefully we'll be able to do better in the future. Closing for now.

lionel- avatar Sep 13 '22 12:09 lionel-