Использовать трубу 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