2

我对 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) 之间的差异。

我想问一下您是否会遇到这种情况,以便发送错​​误报告,或者是否有对此行为的解释以及如何解决它。

提前致谢!!

PS:我的 R 版本是“R 版本 3.4.2 (2017-09-28)”,运行在 GNU/Linux openSUSE Leap 42.2 64 位。Chron 包版本为 2.3-45

4

1 回答 1

1

我会尽量不要将非默认来源与 chron 一起使用,或者至少尽快将它们转换为默认来源。

在这里,我们创建表示与默认来源ch0相同的日期时间。chchron 包确实具有帮助解决此问题的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:已更新 Note。

于 2017-10-04T11:33:56.007 回答