在函数

时间:2017-01-10 14:55:56

标签: r dplyr magrittr

我想使用管道运算符%>%编写一个函数,它是两个函数的组合,因此,例如,以下是等价的(想象一下,我称之为%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%理解参数?是evalquote问题吗?我也不太了解%>%如何阅读lhsrhs中的参数。

任何帮助将不胜感激。非常感谢!

2 个答案:

答案 0 :(得分:2)

以下是一些可能性:

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)

更新:添加了其他解决方案。

答案 1 :(得分:2)

使用magrittr功能序列代替吗?

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

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

或者只是

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