R上可能的错误与chron和sapply



我对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:已更新注释。

最新更新