[Rd] Inconsistency of c.Date: non-commutativity and non-integer Value

Dirk Eddelbuettel edd @end|ng |rom deb|@n@org
Fri Jan 22 22:17:42 CET 2021


On 22 January 2021 at 21:35, Jens Heumann wrote:
| Dear r-devel,
| 
| Today I came across what I would call inconsistencies in the `c.Date` 
| method compared to what happens when concatenating other classes: 1. 
| Non-commutativity: The type in the arrangements of the elements does 
| matter (first element is critical), 2. the resulting value is numeric 
| instead of expected integer (as in the case with factors).
| 
|  > ## 
| Examples####################################################################
|  > ## 1. Non-commutativity:
|  > c(.1, Sys.Date())
| [1]     0.1 18649.0
|  > c(as.integer(.1), Sys.Date())
| [1]     0 18649
|  > ## whereas:
|  > c(Sys.Date(), .1)
| Error in as.Date.numeric(e) : 'origin' must be supplied
|  > c(Sys.Date(), as.integer(.1))
| Error in as.Date.numeric(e) : 'origin' must be supplied
|  >
|  > ## 2. Numeric instead of numeric value
|  > str(c(as.integer(.1), Sys.Date()))
|   num [1:2] 0 18649  ## not integer
|  > 
| ################################################################################ 
| 
| 
| I'm not sure if `c.Date` should redefined, since there would probably be 
| many more classes to consider. However, the error message "'origin' must 
| be supplied" cannot be served by the user and appears to me like an 
| imperfection in the design.
| 
| It would be desirable if `c.Date` harmonizes with the hierarchy stated 
| in `?c`: "NULL < raw < logical < integer < double < complex < character 
| < list < expression. [...] factors are treated only via their internal 
| integer codes" and behaves best like a factor (and also throws integer 
| values as in 2. above).
| 
| Or maybe disabling non-dates at all `if (!all(sapply(list(Sys.Date(), 
| .1), "class") == "Date")) stop...`, but this is a little beyond my 
| knowledge.
| 
| Anyway, I hope my remark is of relevance and contributes to the 
| continuous development of our great programming language R!

Nice analysis, well done.  Sadly it is also a "known feature" of the c()
operator and documented as such -- S3 class attributes drop. C'est la vie.
>From ?c

     ‘c’ is sometimes used for its side effect of removing attributes
     except names, for example to turn an array into a vector.
     ‘as.vector’ is a more intuitive way to do this, but also drops
     names.  Note that methods other than the default are not required
     to do this (and they will almost certainly preserve a class
     attribute).

I have into that trap approximately 4.56e8 times in this idiom

    > for (d in Sys.Date() + 0:2) print(d)
    [1] 18649
    [1] 18650
    [1] 18651
    > 

Eventually one learns to switch to an iterator, and to pick the dates from a
vector preserving their class.

Dirk

-- 
https://dirk.eddelbuettel.com | @eddelbuettel | edd using debian.org



More information about the R-devel mailing list