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)
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
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...