2011-09-16 30 views
7

我試圖使用chronis.holiday()函數,但我無法使其正常工作。該文檔說要修改.Holiday對象與您希望使用的假期,但我對.Holiday所做的更改似乎沒有被is.holiday()檢測到。有人可以提供一個適當的方式來加載假期的例子嗎?如何爲R中的is.holiday()chron程序包定義假期

回答

9

這是不平凡的,可能值得作爲bug參考chron維護者。

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

(有人誰實際上R中日期的作品往往比我做的大概有前面的東西更優雅的解決方案,而沒有雙精度sapply事情...)

但是這並未」 T改變的重要的事情,這是Holidayschron命名空間版本:

chron::.Holidays ## no change 

的線索是在這裏:Override a function that is imported in a namespace

命名空間魔法:

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

現在來看,它已經工作:

chron::.Holidays 

測試出來:

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) 
+0

謝謝。這比我預期的要複雜得多。 –

+0

上面的解決方案是太棒了,工作,除了似乎有錯誤,如果hlist包括「GBNewYearsEve」 我已經開始了一個新的問題[鏈接](http://stackoverflow.com/questions/ 26777282 /使用-TIMEDATE-R-包在--I-接收-AN-錯誤時-指定-gbnewyearseve) – DaveRGP

0

我試圖做同樣的事情,發現這個較舊的帖子。我不需要修改.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 
相關問題