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 100000 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(100000, {
paste(sample(letters,6,replace = T),collapse = "") == "rstats"
})
)
# user system elapsed
# 1.27 0.00 1.27
%>%
system.time(
replicate(100000,{
sample(letters,6,replace = T) %>%
paste(collapse = "") %>%
equals("rstats")
})
)
# user system elapsed
# 27.55 0.01 27.66
%>>%
system.time({
1:100000 %>>% lapply(function(i) {
sample(letters,6,replace = T) %>>%
paste(collapse = "") %>>%
equals("rstats")
})
})
# user system elapsed
# 3.88 0.00 3.88
system.time(
replicate(100000, {
Pipe(sample(letters,6,replace = T))$
paste(collapse = "")$
equals("rstats") []
})
)
# user system elapsed
# 4.58 0.00 4.58
The more levels the operator is nested in iterations, the larger the performance difference will be.
# magrittr::`%>%`
system.time(lapply(1:1000, function(i)
rnorm(100) %>% c(rnorm(100),
sapply(1:100, function(j)
rnorm(50) %>% c(rnorm(50))))))
# user system elapsed
# 15.68 0.04 15.77
# pipeR::`%>>%`
system.time(lapply(1:1000, function(i)
rnorm(100) %>>% c(rnorm(100),
sapply(1:100, function(j)
rnorm(50) %>>% c(rnorm(50))))))
# user system elapsed
# 3.75 0.03 3.80
These packages use different set of symbols and are thus compatible with each other. You may choose according to your needs and considerations.