2

在寻找修改 chron 包中的 .Holiday 对象的方法时,我发现了这个解决方案 How to define holiday for is.holiday() chron package in R

它本身工作得很好,除了我在 hlist 中包含“GBNewYearsEve”时,我收到一个错误:

 Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'GBNewYearsEve' of mode 'function' was not found

如果从列表中删除 GBNewYearsEve,则不会出现此错误。我错过了什么?

示例工作代码:

library(chron)
library(timeDate)
hlist <- c("GBMayDay", "GBBankHoliday", "GBSummerBankHoliday", "ChristmasEve", "ChristmasDay", "BoxingDay", "NewYearsDay")
(ss <- dates(sapply(sapply(hlist,holiday,year=(c(2011)),as.Date)))
.Holidays <- ss

chron::.Holidays ##nochange

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 ##change

示例非工作代码:

hlist <- c("GBMayDay", "GBBankHoliday", "GBSummerBankHoliday", "ChristmasEve", "ChristmasDay", "BoxingDay", "NewYearsDay", "GBNewYearsEve")
(ss <- dates(sapply(sapply(hlist,holiday,year=2011),as.Date)))
4

1 回答 1

2

不确定这是一个适合您的答案。我对你的问题很好奇,我已经timeDate从 CRAN 下载了包。尽管它似乎记录在 中?holiday,但我认为代码还没有为GBNewYearsEve.

如果我按原样运行您的代码,我会得到:

> hlist <- c("GBMayDay", "GBBankHoliday", "GBSummerBankHoliday", "ChristmasEve", "ChristmasDay", "BoxingDay", "NewYearsDay", "GBNewYearsEve")
> 
> (ss <- dates(sapply(sapply(hlist,holiday,year=2011),as.Date)))
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  el objeto 'GBNewYearsEve' de modo 'function' no fue encontrado

(对不起语言的混合,基本上错误信息是说GBNewYearsEve没有找到。我实际上没有在代码中找到它timeDate。但是,如果我添加这样的定义:

GBNewYearsEve =
  function(year = getRmetricsOptions("currentYear")) {
    ans = year*10000 + 1231
    timeDate(as.character(ans)) } 

(这基本上是复制自DENewYearsEve,包中唯一的除夕定义)

然后我让你的代码运行:

> (ss <- dates(sapply(sapply(hlist,holiday,year=2011),as.Date)))
           GBMayDay       GBBankHoliday GBSummerBankHoliday        ChristmasEve        ChristmasDay           BoxingDay 
           05/02/11            05/30/11            08/29/11            12/24/11            12/25/11            12/26/11 
        NewYearsDay       GBNewYearsEve 
           01/01/11            12/31/11 

但是我不确定这个解决方案有多好。请注意,在 中dateTime,进行了一些额外的转换,例如,当假期在周末时,它被移到第二天。使用上面的代码,您将获得 12 月 31 日的新年前夜。

例如,这是在holiday-LONDON.R

        # New Year's Day: if it falls on Sat/Sun, then is
        # moved to following Monday
        posix1 <- as.POSIXlt(NewYearsDay(y))
        if (posix1$wday == 0 | posix1$wday == 6) {
            lon <- timeDate(.on.or.after(y, 1, 1, 1), zone = "London",
                            FinCenter = "Europe/London")
            holidays <- c(holidays, as.character(lon))
        } else {
            holidays <- c(holidays, as.character(posix1))
        }

我猜这个包只处理每个国家的法定假日,并添加那些额外的规则?

于 2016-11-12T15:50:15.113 回答