pipeR operator and Pipe object can achieve high performance especially when they are intensively called.
%>%
in magrittr which also provides additional aliases of basic functions. Run an experiment for 10000 times. Each time we take a random sample from lower letters (a-z) with replacement, paste these letters together and see whether it equals the string rstats.
system.time(
replicate(10000, {
paste(sample(letters,6,replace = T),collapse = "") == "rstats"
})
)
# user system elapsed
# 0.13 0.00 0.10
%>%
system.time(
replicate(10000,{
sample(letters,6,replace = T) %>%
paste(collapse = "") %>%
equals("rstats")
})
)
# user system elapsed
# 2.80 0.00 2.86
%>>%
system.time({
1:10000 %>>% lapply(function(i) {
sample(letters,6,replace = T) %>>%
paste(collapse = "") %>>%
equals("rstats")
})
})
# user system elapsed
# 0.29 0.00 0.30
system.time(
replicate(10000, {
Pipe(sample(letters,6,replace = T))$
paste(collapse = "")$
equals("rstats") []
})
)
# user system elapsed
# 0.43 0.00 0.44
The more levels the operator is nested in iterations, the larger the performance difference will be.
# magrittr::`%>%`
system.time(lapply(1:100, function(i)
rnorm(100) %>% c(rnorm(100),
sapply(1:100, function(j)
rnorm(50) %>% c(rnorm(50))))))
# user system elapsed
# 2.11 0.00 2.12
# pipeR::`%>>%`
system.time(lapply(1:100, function(i)
rnorm(100) %>>% c(rnorm(100),
sapply(1:100, function(j)
rnorm(50) %>>% c(rnorm(50))))))
# user system elapsed
# 0.30 0.00 0.29
These packages use different set of symbols and are thus compatible with each other. You may choose according to your needs and considerations.