magrittr 和日期对象

magrittr and date objects

我刚刚注意到,当我将两个日期相减,然后尝试使用 magrittr (%>%) 转换为一个数值时,我得到了一个日期,就好像我只是简单地将日期差异包装起来在 as.numeric() 中,我将天数差异作为数值。请参阅下面的简单示例:

## version 1
as.Date("2014-10-10") - as.Date("2014-10-1") %>% as.numeric
## return value -->  "1970-01-10"

## version 2 (returning the value that I actually want)
as.numeric(as.Date("2014-10-10") - as.Date("2014-10-1"))
## return value --> 9

虽然这在这里没什么大不了的,但我想了解为什么会发生这种情况,以便能够预测其他(对我来说出乎意料的)行为。

试试这个,没有额外的括号,首先计算管道,然后减法。

(as.Date("2014-10-10") - as.Date("2014-10-1")) %>% as.numeric

一个"all-in magrittr solution"也可以。鉴于最近管道操作员的使用急剧增加,不少人评论说,过度接触管道操作员(和别名)可能会伤害他们的眼睛。因此剧透块。

as.Date("2014-10-10") %>%
减法(as.Date(“2014-10-1”))%>%
as.numeric

# [1] 9

我特别觉得 magrittr 中操作的命名非常烦人。在给定的示例中,我将使用 bizarro pipe,效果很好

library(magrittr)
as.Date("2014-10-10") - as.Date("2014-10-1") %>% as.numeric
## [1] "1970-01-10"
as.Date("2014-10-10") - as.Date("2014-10-1") ->.; as.numeric(.)
## [1] 9

更进一步,虽然你需要 3 个管道来获得以下示例中的周差(我不喜欢 @zx8754 提出的括号解决方案,因为我认为它违背了在第一名),你可以只用 1 个 bizarro。

as.Date("2014-10-10") %>% subtract(as.Date("2014-08-1")) %>% as.numeric %>% divide_by(7)
## [1] 10
as.Date("2014-10-10") - as.Date("2014-08-1") ->.; as.numeric(.)/7
## [1] 10

我并不是说使用 bizarro 是解决方案,我只是认为 magrittr 可以改进,仅此而已。