Как я могу использовать оператор цепочки "dplyr" %>% получить левую сторону в R?

Пакет "dplyr" имеет цепной оператор. Но у меня есть проблема с тем, как получить правильный термин.

Например:

c(5,7,8,1) %>% sum(`[`(1:3)) # get result 27 (This is wrong)

c(5,7,8,1) %>% sum(.[1:3]) # get result 41 (This is also wrong)

c(5,7,8,1) %>% `[`(1:3) %>% sum()   # get result 20 (This is right)

Почему коды первой и второй строк неверны? Что произошло в них?

Ответы

Ответ 1

Точка . верна. Однако %>% также вставляет его в качестве первого аргумента:

x = c(5,7,8,1)
x %>% sum(.[1 : 3])

То же, что и:

sum(x, x[1 : 3])

Вы можете явно предотвратить это поведение, обернув выражение в фигурные скобки:

x %>% {sum(.[1 : 3])}

Однако в этот момент может быть лучше разбить конвейер немного больше (как вы сделали сами):

x %>% `[`(1 : 3) %>% sum()

Или, используя вспомогательные функции magrittr (требуется library(magrittr)):

x %>% extract(1 : 3) %>% sum()

Ответ 2

Процитировать документ:

Размещение lhs в качестве первого аргумента в вызове rhs. Поведение по умолчанию % > %, когда в вызове rhs требуется несколько аргументов, необходимо разместить lhs в качестве первого аргумента, т.е. x% > % f (y) эквивалентно f (x, y).

Итак, что происходит?

Когда вы вызываете сумму, она вызывается так:

n <- c(5,7,8,1) 
sum(n,n[1:3])

Lhs из %>% передается как первый arg для суммы, а подмножество - вторым аргументом. В вашей третьей форме только вывод селектора передается как аргумент sum