Как я могу использовать оператор цепочки "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