поведение оператора трубы в функциях композиции purrr - dplyr - PullRequest
0 голосов
/ 10 мая 2018

Использование оператора pipe в пакетах purrr-dplyr (вкратце) определяется следующим образом:

y%>% f (x,., Z) совпадает с f (x,y, z)

Я пытаюсь выполнить следующую задачу с помощью оператора pipe.Сначала я покажу вам задачу без использования труб:

#####for reproducibility
set.seed(50)
z0<-factor(sample(c(letters[1:3],NA),100,replace = T))
###the task
rep(1,length(table(z0)))

, теперь я хочу сделать это с помощью труб:

z0%>%table%>%rep(1,length(.))

, однако результат не тот же.Кажется, что оператор канала не может обработать правильное назначение композиции функций.То есть

y%>% f (x, g (.)) Должно быть таким же, как f (x, g (y))

, поэтомуконкретный вопрос: возможно ли это сделать

y%>% f (x, g (.))

Заранее благодарим вас за ваши комментарии.

1 Ответ

0 голосов
/ 10 мая 2018

%>% реализует правило первого аргумента, то есть передает предыдущие данные в качестве первого аргумента функции, если . не является прямым аргументом;Во втором случае аргументом rep является 1 и length(.), поэтому правило первого аргумента вступает в силу;Чтобы избежать этого, используйте {}, чтобы заключить выражение;Вы можете прочитать больше об этом в разделе Повторное использование заполнителя для атрибутов :

Повторное использование заполнителя для атрибутов

Itпросто использовать заполнитель несколько раз в выражении справа. Однако, когда заполнитель появляется только во вложенных выражениях, magrittr все равно будет применять правило первого аргумента. Причина в том, что в большинстве случаев это приводит к более чистому коду.

 x %>% f(y = nrow(.), z = ncol(.)) is equivalent to f(x, y = nrow(x), z = ncol(x))

поведение можно отменить, заключив правую часть в фигурные скобки:

x %>% {f(y = nrow(.), z = ncol(.))} is equivalent to f(y = nrow(x), z = ncol(x))
rep(1,length(table(z0)))
# [1] 1 1 1

Эквивалент будет:

z0 %>% table %>% {rep(1,length(.))}
# [1] 1 1 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...