Data.table: fcase doesn't recognize S4 object : lubridate example

Created on 19 Dec 2019  ·  5Comments  ·  Source: Rdatatable/data.table

Thank you all for the hard work in creating fcase. I have tried it out on a project that I'm currently working on and encountered problems when it was used together with lubridate period creation functions. It seems to recognize lubridate::weeks, lubridate::months, lubridate::years as lubridate::days.

reprex:

# Loading packages --------------------------------------------------------

library(data.table)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:data.table':
#> 
#>     hour, isoweek, mday, minute, month, quarter, second, wday, week,
#>     yday, year
#> The following object is masked from 'package:base':
#> 
#>     date
library(lest)

# Creating test data ------------------------------------------------------

dt <- data.table(period_unit = c("days", "months", "weeks", "years"),
                 period_length = rep(1, times = 4))

# fcase output ------------------------------------------------------------

dt[, period := fcase(period_unit == "days", days(period_length),
                     period_unit == "months", months(period_length),
                     period_unit == "weeks", weeks(period_length),
                     period_unit == "years", years(period_length))][]
#>    period_unit period_length      period
#> 1:        days             1 1d 0H 0M 0S
#> 2:      months             1 1d 0H 0M 0S
#> 3:       weeks             1 1d 0H 0M 0S
#> 4:       years             1 1d 0H 0M 0S

# case_when output --------------------------------------------------------

dt[, period := case_when(period_unit == "days" ~ days(period_length),
                         period_unit == "months" ~ months(period_length),
                         period_unit == "weeks" ~ weeks(period_length),
                         period_unit == "years" ~ years(period_length))][]
#>    period_unit period_length            period
#> 1:        days             1       1d 0H 0M 0S
#> 2:      months             1    1m 0d 0H 0M 0S
#> 3:       weeks             1       7d 0H 0M 0S
#> 4:       years             1 1y 0m 0d 0H 0M 0S

Created on 2019-12-19 by the reprex package (v0.3.0)

Session info

devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 3.6.2 (2019-12-12)
#>  os       Linux Mint 18.3             
#>  system   x86_64, linux-gnu           
#>  ui       X11                         
#>  language en_SG:en                    
#>  collate  en_SG.UTF-8                 
#>  ctype    en_SG.UTF-8                 
#>  tz       Asia/Singapore              
#>  date     2019-12-19                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 3.6.1)
#>  backports     1.1.5   2019-10-02 [1] CRAN (R 3.6.1)
#>  callr         3.4.0   2019-12-09 [1] CRAN (R 3.6.1)
#>  cli           2.0.0   2019-12-09 [1] CRAN (R 3.6.1)
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 3.6.1)
#>  data.table  * 1.12.9  2019-12-19 [1] local         
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 3.6.1)
#>  devtools      2.2.1   2019-09-24 [1] CRAN (R 3.6.1)
#>  digest        0.6.23  2019-11-23 [1] CRAN (R 3.6.1)
#>  ellipsis      0.3.0   2019-09-20 [1] CRAN (R 3.6.1)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 3.6.1)
#>  fansi         0.4.0   2018-10-05 [1] CRAN (R 3.6.1)
#>  fs            1.3.1   2019-05-06 [1] CRAN (R 3.6.1)
#>  glue          1.3.1   2019-03-12 [1] CRAN (R 3.6.1)
#>  highr         0.8     2019-03-20 [1] CRAN (R 3.6.1)
#>  htmltools     0.4.0   2019-10-04 [1] CRAN (R 3.6.1)
#>  knitr         1.26    2019-11-12 [1] CRAN (R 3.6.1)
#>  lest        * 1.1.0   2019-11-29 [1] CRAN (R 3.6.1)
#>  lubridate   * 1.7.4   2018-04-11 [1] CRAN (R 3.6.1)
#>  magrittr      1.5     2014-11-22 [1] CRAN (R 3.6.1)
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 3.6.1)
#>  pkgbuild      1.0.6   2019-10-09 [1] CRAN (R 3.6.1)
#>  pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.6.1)
#>  prettyunits   1.0.2   2015-07-13 [1] CRAN (R 3.6.1)
#>  processx      3.4.1   2019-07-18 [1] CRAN (R 3.6.1)
#>  ps            1.3.0   2018-12-21 [1] CRAN (R 3.6.1)
#>  R6            2.4.1   2019-11-12 [1] CRAN (R 3.6.1)
#>  Rcpp          1.0.3   2019-11-08 [3] CRAN (R 3.6.1)
#>  remotes       2.1.0   2019-06-24 [1] CRAN (R 3.6.1)
#>  rlang         0.4.2   2019-11-23 [1] CRAN (R 3.6.1)
#>  rmarkdown     2.0     2019-12-12 [1] CRAN (R 3.6.1)
#>  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.6.1)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.6.1)
#>  stringi       1.4.3   2019-03-12 [1] CRAN (R 3.6.1)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 3.6.1)
#>  testthat      2.3.1   2019-12-01 [1] CRAN (R 3.6.1)
#>  usethis       1.5.1   2019-07-04 [1] CRAN (R 3.6.1)
#>  withr         2.1.2   2018-03-15 [1] CRAN (R 3.6.1)
#>  xfun          0.11    2019-11-12 [1] CRAN (R 3.6.1)
#>  yaml          2.2.0   2018-07-25 [1] CRAN (R 3.6.1)
#> 
#> [1] /home/edt/R/3.6/library
#> [2] /usr/local/lib/R/site-library
#> [3] /usr/lib/R/site-library
#> [4] /usr/lib/R/library

feature request

All 5 comments

I am not sure but I think I see where the issue is coming from. We only take into account the attributes of the first argument. We actually have the same problem with fifelse and fcoalesce. I think we need to manage S4 object at C levels.

@torema-ed , thank you very much for reporting this. I will raise it as a feature request. In the meantime I think that we should notify the user (at least for fifelse and fcase) that S4 object are not supported. I will hence raise an issue for that.

@torema-ed , now that #4135 has been closed you should have an error message in your example.

@2005m Great, thank you!

I'll leave the decision of closing this issue to you as I'm not too sure if you want to keep it open for future reference.

Thank you @torema-ed , I would leave it open for now in case there are other S4 objects for which fcase is not working. I am also curious to know if there is a real demand for it. Depending on the Rdatatable team we might want to support lubridate in the future or not...it is opened to discussion...

Was this page helpful?
0 / 5 - 0 ratings