2016-01-29 10 views
3

Я хочу переписать следующий код с трубами из magrittr:Использование magrittr и который

max(diff(which(diff(runif(50)) > 0))) 

Мой простой подход был бы:

library(magrittr) 
runif(50) %>% diff > 0 %>% which %>% diff %>% max 

Но это не удается из-за (первого) который:

runif(50) %>% diff > 0 %>% which 

Ошибка, в котором (.): ар gument to 'which' не является логическим

Я не уверен, почему возникает эта ошибка, и почему трубопроводы, которые, похоже, отличаются от трубопроводов к другим функциям, поскольку вывод «diff> 0» является логическим вектором.

Замечание, что бы там быть способом трубы для сравнения, грубо говоря

runif(50) %>% diff %>% > 0 

Спасибо за ваши советы!

+3

Полностью magrittr'ed версия будет 'х%>% дифф%>% is_greater_than (0)%>% который%>% diff%>% max' imo –

ответ

6

Try:

runif(50) %>% diff %>% `>`(0) %>% which %>% diff %>% max 

Edit: Если, вероятно, указывают на то, что те, обратные кавычки не кавычки.

+1

Это лучший синтаксис. Если вы не знакомы с ним, это означает: 'runif (50)%>% diff%>% function (x) {x> 0}%>%,%%%%%>% max' – sdgfsdh

+0

благодарю вас за объяснение также! – mondano

0

Я считаю, что ваша проблематичной строка обрабатывается как эквивалент:

(runif(50) %>% diff) > (0 %>% which %>% diff %>% max) 

возвращает ту же ошибку.

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

runif(50) %>% {diff(.) > 0} %>% which %>% diff %>% max 
(runif(50) %>% diff > 0) %>% which %>% diff %>% max