Использовать трубу magrittr в затворах

1 Давайте посмотрим на этот пример:

1:3 %>% rep(.,2) + 1 %>% sum  #[1] 2 3 4 2 3 4

[2] Что делает R:

1:3 %>% rep(.,2) + (1 %>% sum)

[3] Я хочу, чтобы R: (что выдает ошибку), мне нравится получать 18 там.

1:3 %>% (rep(.,2) + 1) %>% sum  #Error in rep(., 2) : attempt to replicate an object of type 'closure'

[4] Так что мне нужно стать супер хромым:

tmp <- 1:3 %>% rep(.,2) + 1
tmp %>% sum #[1] 18

Как я могу исправить [3] на работу. Может кто-нибудь объяснить мне сообщение об ошибке?

редактировать

Отсюда

Обратите внимание, что переменная x слева от%>% применяется в качестве первого аргумента в функции справа. Это поведение по умолчанию можно изменить с помощью. который называется заполнителем.

Однако важно помнить, когда. появляется во вложенных выражениях, правило первого аргумента все еще применяется. Но это поведение может быть подавлено с помощью фигурных скобок { }

Интересно, что я не знал

Это равное:

1:3 %>% sum(rep(.,3))   #[1] 24
1:3 %>% sum(.,rep(.,3)) #[1] 24

И эти два равны:

1:3 %>% {sum(rep(.,3))}  #[1] 18
1:3 %>% rep(.,3) %>% sum #[1] 18 

Edit2

> packageVersion("magrittr")
[1] ‘1.5’

Это:

?'%>%'

дает: (я не знаю, какой пакет стоит за моим оператором%>%, мне это не очень нравится, если честно)

Справка по теме "%>%" была найдена в следующих пакетах:

Трубный оператор (в пакете tidyr в библиотеке C:/Program Files/R/R-3.3.2/library) magrittr forward-pipe-оператор (в пакете magrittr в библиотеке C: / Program Files / R / R-3.3.2 / library) Оператор конвейера (в пакете stringr в библиотеке C: / Program Files / R / R-3.3.2 / library) Объекты, экспортированные из других пакетов (в пакете dplyr в библиотеке C: / Program Files / R / R-3.3.2 / библиотека)

1 ответ

Решение

Бинарный оператор + создает проблему. Он имеет более низкий приоритет, чем труба (см. ?Syntax). Либо заключите всю операцию в круглые скобки перед конвейером для суммирования, либо используйте функциональную форму +:

(1:3 %>% rep(.,2) + 1) %>% sum
[1] 18

1:3 %>% rep(.,2) %>% `+`(1) %>% sum
[1] 18
Другие вопросы по тегам