ITPub博客

首页 > > > R语言中的管道操作

R语言中的管道操作

作者:浪花小雨滴 时间:2020-06-16 15:28:21 0 删除 编辑
在刚开始接触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))

上述代码形成的图如下。

microbenchmark是R语言中做微基准测试的利器,具体介绍可以参阅Hadley Wickham写的 Advanced R。fmagrittr和fmagrittrdot是magrittr包的写法,fsemicolon是R语言原生写法,fpiper和fpipeline是pipeR包的写法。

从上述简单测试结果来看:

  • fsemicolon性能好(“->.;”写法有点丑)
  • pipeR的性能还可以(写起“%>>%”有点长)
  • magrittr性能弱于原生写法和pipeR(该包名气大,且在Rstudio中有“Ctrl+Shift+M”快捷键支持)


如果是仅仅是做一份数据分析,然后出一份报告或者是论文,那么可以自由选择。如果是做一份大型项目,那么在引入外部包的时候,还是根据实际业务情况,做一些测试再做决定。

因为“你会看到有许多 R 代码,都是为了急于解决一个紧迫的问题而编写的。 因此,那些代码不是很优雅、快速或者容易理解。 而大多数用户并不修改他们代码中的这些缺点”。这句话是Hadley Wickham说的。N个方法,先实现一个,拿到结果才是最重要的,代码优化可以稍后进行。

附本次R语言运行环境。

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936 LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] pipeR_0.6.1.3          ggplot2_2.2.0          magrittr_1.5          
[4] microbenchmark_1.4-2.1 RevoUtilsMath_10.0.0  

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.8      digest_0.6.10    assertthat_0.1   grid_3.3.2       plyr_1.8.4      
 [6] gtable_0.2.0     scales_0.4.1     lazyeval_0.2.0   RevoUtils_10.0.2 labeling_0.3    
[11] tools_3.3.2      munsell_0.4.3    colorspace_1.3-1 tibble_1.2 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3161445/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: SQL 数据类型
请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39978