在使用timeDate R包时,指定GBNewYearsEve时收到错误 [英] In using timeDate R package, I receive an error when specifying GBNewYearsEve
问题描述
除了本身在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屋!