R 上的 chron 和 sapply 可能存在错误

Possible bug on R with chron and 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 version 3.4.2 (2017-09-28)",运行ning on 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)))

更新二:已更新笔记