R语言中的管道操作
在刚开始接触R语言时,对管道操作不太了解。后来用的多了就发现管道操作在写代码上有一定的优势:可以避免生成中间变量,代码可读性更好。不过后来在做数据分析时基本上很少用管道操作。因为R语言中负责管道操作的神器magrittr已经很久没有更新了。此外,在用data.table整理数据时使用管道操作的需求并不高。
截止到发稿时,magrittr在CRAN上的图是这样的。
今天看到magrittr’s Doppelgänger一文,涉及管道操作的性能问题。在该文的基础上加一些代码,看看另外一个管道操作神器pipeR跟该文提到的3种写法做一个简单的比较。
library("microbenchmark")
library("magrittr")
library("ggplot2")
library("pipeR")
set.seed(234634)
fmagrittr <- function(d) {
d %>% sin() %>% cos() %>% tan() %>% sqrt()
}
fmagrittrdot <- function(d) {
d %>% sin(.) %>% cos(.) %>% tan(.) %>% sqrt(.)
}
fsemicolon <- function(d) {
d ->.; sin(.) ->.; cos(.) ->.; tan(.) ->.; sqrt(.)
}
fpiper <- function(d) {
d %>>% sin() %>>% cos() %>>% tan() %>>% sqrt()
}
fpipeline <- function(d) {
pipeline({
d
sin()
cos()
tan()
sqrt()
}
)
}
bm <- microbenchmark(
fmagrittr(7),
fmagrittrdot(7),
fsemicolon(7),
fpiper(7),
fpipeline(7),
control=list(warmup=100L,
order='random'),
times=10000L
)
highcut <- quantile(bm$time,probs=0.95)
ggplot(data=as.data.frame(bm),aes(x=time,color=expr)) +
geom_density(adjust=0.3) +
facet_wrap(~expr,ncol=1,scales = 'free_y') +
scale_x_continuous(limits = c(min(bm$time),highcut))
相关文章