2017-01-10 5 views
0

Я хотел написать функцию, которая представляет собой состав из двух функций, используя оператор трубы %>%, так что, например, следующие эквиваленты (представьте, что я называю это %O%):передать аргументы, когда труба вызвана внутри функции

iris[1:4] %>% lapply(FUN = function(x) hist(sample(x)) 
iris[1:4] %>% lapply(FUN = sample %O% hist) 

Я хочу его в этом направлении (не hist %O% sample), потому что он будет следовать той же логике, как %>%.

Я пришел к чему-то вроде этого:

'%O%' <- function(lhs1, rhs1){ 
    return(
     function(x){ 
      return(x %>% lhs1 %>% rhs1) 
    }) 
} 

Однако, это вызывает ошибки при попытке

iris[1:4] %>% lapply(FUN = sample(size = 100, replace = TRUE) %O% hist) 

Что я должен сделать, чтобы параметры, которые будут поняты %>% внутри %O% функция? Это проблема eval и quote? Я также не совсем понимаю, как %>% способен читать аргументы в lhs и rhs.

Любая помощь будет оценена по достоинству. Большое спасибо!

ответ

1

Использовать функциональную последовательность magrittr?

f <- . %>% sample() %>% hist() 

iris[1:4] %>% lapply(f) 

Или просто

iris[1:4] %>% lapply(. %>% sample() %>% hist()) 
+1

Спасибо, вот и все, что мне нужно. Не знал, что я могу определить такие функции. 'magrittr' - это потрясающе! –

1

Вот некоторые возможности:

iris[1:4] %>% lapply(FUN = function(x) x %>% sample %>% hist) 

library(gsubfn) 
iris[1:4] %>% fn$lapply(FUN = x ~ x %>% sample %>% hist) 

library(functional) 
iris[1:4] %>% lapply(FUN = Compose(sample, hist)) 

library(functional) 
`%c%` <- Compose 
iris[1:4] %>% lapply(FUN = sample %c% hist) 

Update: Добавлены дополнительные решения.

+0

не знал об этих библиотеках ти! Кажется, что Магритт тоже хорошо работает. Благодаря! –