【问题标题】:dplyr date as.numeric strange behavior [duplicate]dplyr date as.numeric 奇怪的行为
【发布时间】:2016-10-18 14:10:57
【问题描述】:

我刚刚注意到一个奇怪而有趣的错误:

as.numeric((Sys.Date()-30)-Sys.Date())
#[1] -30

这是正确的。但是:

library(dplyr)
(Sys.Date()-30)-Sys.Date() %>% as.numeric()
#[1] "1969-12-02"

如果%>% 只是将输出馈送到第一个参数槽,那么这种行为肯定不正确吗?

【问题讨论】:

  • 操作顺序?将整个部分放在管道前的括号中。我想运算符优先级是我的意思,而不是操作顺序。
  • 或者完全采用 magrittr'esque:library(magrittr); Sys.Date() %>% subtract(30) %>% subtract(Sys.Date()) %>% as.numeric。这会迫使您放置正确的顺序。
  • 不是错误,对运算符优先级的误解,以及将%>% 误解为“左侧的所有内容”魔术语法小精灵。
  • 人力资源部。我猜%>% 真的不是管道。 :(

标签: r dplyr


【解决方案1】:

我已经修改了您的代码,以便将来可以重现:

date <- as.Date("2016-10-18")

as.numeric((date-30)-date)
#[1] -30
(date-30)-date %>% as.numeric()
#[1] "1969-12-02"

您可能还注意到,放置括号会改变这些结果:

(date-30)-(date %>% as.numeric())
#[1] "1969-12-02"
((date-30)-date) %>% as.numeric()
#[1] -30

答案是按照Syntax help page 中指定的操作顺序。它指出:

定义了以下一元和二元运算符。它们被列出 在优先级组中,从高到低。

:: ::: 访问命名空间中的变量
$@组件/槽提取
[ [[ 索引
^ 求幂(从右到左)
- + 一元减号和加号
: 序列运算符
%any% 特殊运算符(包括 %% 和 %/%)
* / 乘除
+ - (二进制)加减法

请注意,%any% 位于 + - (binary) 之前。对于一元和二元运算符的区别,我推荐this question的答案。

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多