搜索
查看: 612|回复: 0

[R] 慧美——R for data science 第13章 使用magrittr进行管道操作

[复制链接]

39

主题

40

帖子

295

积分

中级会员

Rank: 3Rank: 3

积分
295
发表于 2018-11-28 07:59:27 | 显示全部楼层 |阅读模式
R for data science 第13章  使用magrittr进行管道操作
13.1 简介
管道是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。
  • 准备工作
    • 管道 %>% 来自于 Stefan Milton Bache 开发的 magrittr 包。因为 tidyverse 中的包会自动加载%>%,所以通常你无须显式地加载 magrittr。
    • library(magrittr)


13.2 管道的替代方式
  • 将每个中间步骤保存为一个新对象;
    • 必须为每个中间结果建立一个变量
    • 这些变量其实是没有什么实际意义的
    • 代码中充斥着大量不必要的变量
    • 你必须在每一行代码中小心翼翼地修改变量后缀

  • 多次重写初始对象;
    • 调试起来太痛苦了。如果出错,那么你就必须从头开始运行整个流程。
    • 对象的多次重写, 阻碍我们看清每行代码中发生的变化。

  • 组合多个函数;
    • 必须按照从内向外和从右向左的顺序阅读代码,而且参数太分散了
    • 不适合人类阅读

  • 使用管道。
    • 在阅读这一串函数组合时,你可以将它们当成一系列规定动作
    • 管道的工作原理就是进行“词法变换”。在这种方式背后,magrittr 会重新组合管道代码,按照重写中间变量的方式来运行。
    • 管道不能支持以下两类函数
      • 使用当前环境的函数。例如,assign() 函数会在当前环境中使用给定名称创建一个新变量。通过管道方式使用assign()函数式无效的,因为此时赋值操作是由%>%建立的一个临时环境中进行的。若要通过管道方式来使用assign(), 必须指定环境
      • 使用惰性求值的函数。在 R 中,不会在函数调用前计算这种函数的参数,只在函数使用时才进行计算。管道依次计算每个参数,因此不能用在这种函数上。具有这种问题的一个函数是 tryCatch(),它可以捕获并处理程序错误。使用惰性求值的函数还是很多的,其中包括 R 基础包中的 try()、suppressMessages()和 suppressWarnings()。



13.3 不适合使用管道的情形
  • 操作步骤超过10个,应该使用有意义的变量保护中间结果。更容易调试和检查中间结果
  • 有多个输入和输出。需要处理的不是一个基本对象。
  • 操作步骤构成一张具有复杂依赖关系的有向图。管道基本上是一种线性操作,最好不使用它来表示复杂的关系

13.4 magrittr中的其他工具
  • 在使用比较复杂的管道操作时,有时会因为某个函数的副作用而调用它
    • 想要打印或绘制出当前对象,或者想将它保存在硬盘中。很多时候这种函数不会返回任何结果,只会有效地结束管道操作
      • 想要打印或绘制出当前对象,或者想将它保存在硬盘中。很多时候这种函数不会返回任何结果,只会有效地结束管道操作

    • 如果使用的函数不是基于数据框的(也就是说,你必须传给这些函数一个独立的向量, 不能传给它们数据框或基于数据框求值的表达式),那么你就会发现爆炸操作符 %$% 的 妙处。它可以将数据框中的变量“炸出来”,让你显式地引用。
    • magrittr 提供了 %<>% 操作符来执行赋值操作,它可以将以下代码
      mtcars<-mtcars%>%
      transform(cyl=cyl*2)
      替换为
      mtcars%<>%transform(cyl=cyl*2)







上一篇:慧美——R for data science. 第12章 使用lubridate处理日期和时间
下一篇:慧美——R for data science 第14章 函数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-11-20 00:50 , Processed in 0.027915 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.