Это работает так, как вы ожидаете:
tibble(x = c(1,2), y = c(3,4)) %>%
mutate(z = {(.) %>% (function(tb) {tb$x + tb$y})})
# # A tibble: 2 x 3
# x y z
# <dbl> <dbl> <dbl>
# 1 1 3 4
# 2 2 4 6
Проблема не в канале, а скорее в том, что .
, кажется, интерпретируется как функция (которая сбрасывает канал).
Изменить:
@ Aramis7d предоставил ссылку на документацию для magrittr в комментарии. Соответствующая строка:
Использование подставки для точки как lhs
Когда точка используется как lhs, результатом будет функциональная последовательность, то есть функция, которая применяет вся цепочка правых частей по очереди к ее входу. См. Примеры.
Итак, в вашем примере вы пытались назначить целую функцию на z
внутри mutate. Вы можете увидеть это на основе возвращенного сообщения об ошибке. Используя (.)
, мы принудительно оцениваем .
и получаем ожидаемые результаты.
tibble(x = c(1,2), y = c(3,4)) %>%
mutate(z = {. %>% (function(tb) {tb$x + tb$y})})
# Error: Column `z` is of unsupported type function