Правая часть трубы magrittr возвращает FALSE, когда левая помещается в !()

Я столкнулся с проблемой при использовании magrittr %>%, когда возникает неожиданный вывод, когда lhs заключен в !(). Например, я ожидал, что вывод этих двух строк будет идентичным.

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

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

Однако первая строка возвращает 3, как и ожидалось, тогда как вторая строка возвращает FALSE. Почему это?


person chsiung    schedule 25.10.2020    source источник


Ответы (2)


Проблема в приоритете, оберните (..) вокруг первого выражения, и оно будет вести себя так, как ожидалось.

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

Вы можете найти таблицу приоритетов в ?Syntax, где видно, что %any% имеет более высокий приоритет, чем !.

person Ronak Shah    schedule 25.10.2020

С %>% мы можем использовать отрицание (!) также в цепочке

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

Или используйте aliases из magrittr

c(1, 2, 3, 4) %>%
   equals(1) %>% 
   not %>%
   sum
#[1] 3       
person akrun    schedule 25.10.2020