我对R,chron对象和sapply函数有问题。我更改了默认来源:
chron_start <- chron("01/01/2010", "00:30:00",origin.=c(month=1, day=1, year=1900))
ch <- chron_start+(0:(365*24-1))/24
现在,如果我运行:
> sprintf("%s", years(ch[1]))
[1] "2010"
但是,如果我使用 sapply 迭代运行它,我会得到:
> anios <- sapply(ch, function(x){sprintf("%s", years(x))})
> anios[1]
[1] "2080"
所以它提前了 70 年,这就是我的原点(1900 年)和默认原点(1970 年)之间的区别。
我想问一下,为了发送错误报告,您是否会发生这种情况,或者是否有对这种行为的解释以及如何解决它。
提前感谢!!
P.S.:我的R版本是"R版本3.4.2(2017-09-28)",运行在GNU/Linux openSUSE Leap 42.2 64位上。Chron 软件包版本是 2.3-45
我会尽量不要在chron中使用非默认原点,或者至少尽快将它们转换为默认原点。
在这里,我们创建ch0
它表示与ch
相同的日期时间,但具有默认原产地。chron 包确实具有origin
函数(以及origin<-
函数)来帮助解决这个问题,但它没有导出,所以我们必须用chron:::
开头
ch0 <- chron(ch, origin = chron::origin(chron(0)))
# now we get the expected years
anios <- sapply(ch0, function(x){sprintf("%s", years(x))})
head(anios)
## [1] "2010" "2010" "2010" "2010" "2010" "2010"
注:上述ch0
表达式的替代方法是:
ch0 <- ch
chron:::origin(ch0) <- chron:::origin(chron(0))
此外,sapply
也可以替换为:
format(years(ch0))
如果没有sapply,我们甚至不需要ch0
所以这是有效的:
format(years(ch))
更新:从 chron '2.3.51'(刚刚上传到 CRAN)开始,origin
被导出,因此上面的第一行代码不再需要chron:::
ch0 <- chron(ch, origin = origin(chron(0)))
更新2:已更新注释。