Способ работы pipe заключается в том, что он принимает левую часть оператора pipe и передает его в качестве первого аргумента в правую функцию. Итак, здесь, в этом случае, когда нам нужно изменить аргумент данных на all
, нам нужно запретить каналу передавать LHS в RHS. Мы можем сделать это, используя {}
.
library(magrittr)
vec %>% purrr::keep(!grepl("b", .)) %>% {all(. == 'a')}
#[1] TRUE
В vec
давайте проверим, все ли элементы "a"
или "b
". Мы можем использовать %in%
здесь.
vec <- c("a", "b", "a")
Обычная версия без труб будет:
all(vec %in% c('a', 'b'))
#[1] TRUE
С трубами, если мы попробуем
vec %>% all(. %in% c('a', 'b'))
Получим
#[1] NA
Предупреждающее сообщение: Всего (.,.% В% c ("a", "b")): приведение аргумента типа 'символ' к логическому
что здесь происходит следующее:
all(vec, vec %in% c('a', 'b'))
#[1] NA
Предупреждающее сообщение: In all (ve c, ve c% в% c ("a", "b")): принудительный аргумент введите «символ» в логический
, который возвращает то же сообщение.
Чтобы избежать этого, мы используем {}
vec %>% {all(. %in% c('a', 'b'))}
#[1] TRUE
, который дает нам ожидаемый ответ.