R语言中的管道操作

2020-06-16 00:00:00 语言 操作 代码 写法 管道
在刚开始接触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))

相关文章