How to define holidays for is.holiday() chron package in R

This is non-trivial and probably deserves to be referred to the chron maintainer as a bug.

library(chron)
library(timeDate)
hlist <- c("CAVictoriaDay","CACanadaDay","CALabourDay")
(ss <- dates(sapply(sapply(hlist,holiday,year=2011),as.Date)))
.Holidays <- ss

(Someone who actually works with dates in R more often than I do probably has a more elegant solution for the preceding stuff, without that double-sapply thing ...)

But this doesn't change the important thing, which is the version of Holidays in the chron namespace:

chron::.Holidays  ## no change

The clue is here: Override a function that is imported in a namespace

Namespace magic:

unlockBinding(".Holidays", as.environment("package:chron"))
assignInNamespace(".Holidays", .Holidays, ns="chron", 
    envir=as.environment("package:chron"))
assign(".Holidays", .Holidays, as.environment("package:chron"))
lockBinding(".Holidays", as.environment("package:chron"))

Now look, and it has worked:

chron::.Holidays

Test it out:

yrvec <- seq.Date(as.Date("2011-01-01"),
                    as.Date("2011-12-31"),by="day")
plot(is.holiday(yrvec),axes=FALSE)
axis.Date(side=1,yrvec)

I was trying to do the same thing and found this older post. I didn't need to modify .Holidays:

library(timeDate);library(chron)
hlist <- c("USChristmasDay","USGoodFriday","USIndependenceDay","USLaborDay",
    "USNewYearsDay","USThanksgivingDay")        
myholidays  <- dates(as.character(holiday(2000:2013,hlist)),format="Y-M-D")

> is.holiday(as.Date("2013-11-28"),myholidays)

[1] TRUE

> chron::.Holidays
  New Years Day     Memorial Day Independence Day        Labor Day     Thanksgiving        Christmas 
    01/01/92         05/25/92         07/04/92         09/07/92         11/26/92         12/25/92 

Tags:

R