在使用timeDate R包时,指定GBNewYearsEve时收到错误 [英] In using timeDate R package, I receive an error when specifying GBNewYearsEve

查看:182
本文介绍了在使用timeDate R包时,指定GBNewYearsEve时收到错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在寻找一种方法来修改chron包中的.Holiday对象时,我发现了此解决方案 如何为is.holiday()定义假期R

中的chron软件包

除了本身在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)))

解决方案

不确定这是否适合您的答案.我对您的问题很好奇,我已经从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))
        }

我想该程序包仅在每个国家/地区处理法定假日,并添加了这些其他规则?

IN looking for a way to modify the .Holiday object in the chron package I discovered this solution How to define holidays for is.holiday() chron package in R

Which works very well in itself, except when I include "GBNewYearsEve" in hlist, I recieve an error:

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

This error doesn't appear if GBNewYearsEve is removed from the list. What have I missed?

Example Working Code:

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

Example non-working code:

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

解决方案

Not sure this is an answer that will suit you. I was curious with your problem and I've downloaded the timeDate package from CRAN. Although it seems to be documented in ?holiday, I don't think the code is ready for GBNewYearsEve.

If I run your code as it is I get:

> 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

(Sorry for the mixture of languages, basically the error message is saying that GBNewYearsEve was not found. I actually don't find it in the code of timeDate. However, if I add a definition like this:

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

(Which is basically copied from DENewYearsEve, the only definition for New Years' Eve present in the package)

Then I get your code running:

> (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 

However I'm not sure how good a solution is this. Note that in dateTime, some additional transformations are done so that e.g. when the holiday falls in a weekend it is moved to the following day. With the code above, you get just the New Years' Eve on the 31th of December.

For example, this is in 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))
        }

I guess the package is handling only official holidays for each country, and adding those additional rules?

这篇关于在使用timeDate R包时,指定GBNewYearsEve时收到错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆