【问题标题】:In using timeDate R package, I receive an error when specifying GBNewYearsEve在使用 timeDate R 包时,我在指定 GBNewYearsEve 时收到错误
【发布时间】:2014-11-06 10:36:44
【问题描述】:

在寻找修改 chron 包中的 .Holiday 对象的方法时,我发现了这个解决方案 How to define holidays 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)))

【问题讨论】:

    标签: r chron


    【解决方案1】:

    不确定这是适合您的答案。我对你的问题很好奇,我已经从 CRAN 下载了timeDate 包。虽然它似乎记录在 ?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))
            }
    

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

    【讨论】:

    • 很有趣,显然这是不久前的事情了,我得在某个时候回到我的代码来提醒自己。我似乎记得一些文档表明 gbnewyearseve 是内置的并且可以“切换”到,但也许该文档是旧的,正确的或者我的想象试图记住这个问题的上下文。不管怎样,感谢您的贡献。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多