magrittr 管道的 rhs returns FALSE 当 lhs 被放置在 !()

rhs of magrittr pipe returns FALSE when lhs is placed in !()

我在使用 magrittr %>% 时遇到了一个问题,当 lhs 包含在 !() 中时会产生意外的输出。例如,我希望这两行的输出相同。

sum( !( c(1,2,3,4) == 1 ) )

!( c(1,2,3,4) == 1 ) %>% sum()

然而,第一行 returns “3”,正如预期的那样,而第二行 returns “FALSE”。这是为什么?

问题优先,将 (..) 包裹在第一个表达式周围,它的行为符合预期。

(!(c(1,2,3,4) == 1)) %>% sum
#[1] 3

您可以在 ?Syntax 处找到优先级 table,其中您可以看到 %any% 的优先级高于 !

使用 %>%,我们也可以在链接中使用否定 (!)

library(magrittr)
( c(1,2,3,4) == 1 ) %>%
        `!` %>%
         sum
#[1] 3

或使用 magrittr

中的 aliases
c(1, 2, 3, 4) %>%
   equals(1) %>% 
   not %>%
   sum
#[1] 3