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)))
更新二:已更新笔记
我对 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)))
更新二:已更新笔记