2011-09-16 7 views
7

Estoy tratando de usar chron 's is.holiday() función, pero estoy teniendo problemas para hacerlo funcionar. La documentación dice que modifique el objeto .Holiday con las vacaciones que desea usar, pero los cambios que he realizado en .Holiday no parecen ser detectados por is.holiday(). ¿Podría alguien proporcionar un ejemplo de la forma adecuada de cargar vacaciones?Cómo definir las vacaciones para el paquete is.holiday() chron en R

Respuesta

9

Esto no es trivial y probablemente merece ser referido al mantenedor chron como un error.

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

(Alguien que realmente funciona con fechas en R con más frecuencia de lo que hago, probablemente, tiene una solución más elegante para la materia anterior, sin necesidad de que hacer doble sapply cosa ...)

Pero este doesn' t cambiar lo importante, que es la versión de Holidaysen el espacio de nombres chron:

chron::.Holidays ## no change 

la pista está aquí: Override a function that is imported in a namespace

Espacio de nombres mágica:

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

Ahora mira, y se ha trabajado:

chron::.Holidays 

probarlo:

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

Gracias. Eso fue significativamente más complicado de lo que esperaba. –

+0

La solución anterior es fantástica, y funciona, con la excepción de que parece haber un error si hlist incluye "GBNewYearsEve" He comenzado una nueva pregunta sobre ese [enlace] (http://stackoverflow.com/questions/ 26777282/in-using-timedate-r-package-i-receive-an-error-when-specifying-gbnewyearseve) – DaveRGP

0

yo estaba tratando de hacer lo mismo y se encontró esta publicación más antigua. No necesité modificar .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 
Cuestiones relacionadas