如何为R中的is.holiday()chron包定义假期

mat*_*t_k 7 r

我正在尝试使用它chronis.holiday()功能,但我无法让它工作.文档说要修改.Holiday您希望使用的假期对象,但我所做的更改.Holiday似乎没有被检测到is.holiday().有人可以提供一个加载假期的适当方法的例子吗?

Ben*_*ker 9

这是非平凡的,可能值得将chron维护者称为bug.

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

(实际上在R中使用日期的人比我更常使用前面的东西更优雅的解决方案,没有那么双重sapply......)

但是,这并不能改变重要的事情,这是该版本Holidays chron命名空间:

chron::.Holidays  ## no change
Run Code Online (Sandbox Code Playgroud)

线索在这里:覆盖在命名空间中导入的函数

命名空间魔术:

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"))
Run Code Online (Sandbox Code Playgroud)

现在看,它有效:

chron::.Holidays
Run Code Online (Sandbox Code Playgroud)

测试出来:

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)
Run Code Online (Sandbox Code Playgroud)