今天想要研究一下R语言中含有百分号(%)符号的含义,之前没系统归纳过,就借此机会好好做个笔记吧。
了解管道函数
使用R语言处理数据或者分析,很多时候免不了要写连续输入输出的代码,按照传统书写方式或者习惯,初学者往往会引入一大堆中介变量,或者使用函数嵌套进行一次性输出。
1、使用中介变量会使得内存开销成倍增长,特别是你的原始数据量非常大而内存又有限,在一个处理过程中引入太多中介对象,不仅代码冗余,内存也会迅速透支。
2、使用函数嵌套则避免了内存占用的问题,但是嵌套太多层函数,会造成代码难以理解,阅读困难,甚至给今后的项目复用造成很大的困扰。
- 因此R中的大佬们也意识到这个问题,因此就引入了管道操作符函数,进行连续传参,实现了内存节省、代码优化的需求。
- 通常我们使用最多的管道函数来自于magrittr包,该包中管道操作函数写作
%>%
,这是一个在R语言中使用非常频繁的函数,很多比较成熟的项目扩展包都已经实现了管道操作函数的内置。(比如dplyr、rvest、leaflet等都实现了默认调用)。
应用管道函数
- %>%:表示将左边的结果传递给右边,通常右边是一个函数,它会对传过来的结果进行相对应的计算。
> library(magrittr) #首先加载R包
> x1 %>% abs %>% sort %>% print
[1] 0.4099607 0.4564930 0.7520911 0.8002720 1.0047015 1.0146603
[7] 1.5045253 1.5460878 1.5702044 1.7963906
- 解释:将x1的变量传给abs函数,abs函数会给x1取绝对值,然后将绝对值后的结果传给sort函数,该函数对这个结果进行排序,排完序之后会将结果传递给print函数,这个函数会将最终结果打印显示出来。
2.%<>%:与%>%类似,也是将左边的结果传递给右边的函数进行计算,不同的是这个操作符会将最后的结果返回给最开始的变量。
> x2 %<>% abs %<>% sort %<>% print
[1] 0.4099607 0.4564930 0.7520911 0.8002720 1.0047015 1.0146603
[7] 1.5045253 1.5460878 1.5702044 1.7963906
- emmm,对的,目前看来这与上面的代码结果十分一致。
但是区别正是在于最开始的变量啦。
> x1
[1] 0.4099607 0.7520911 -1.0047015 -0.4564930 1.0146603
[6] 1.5045253 0.8002720 1.5460878 1.7963906 -1.5702044
> x2
[1] 0.4099607 0.4564930 0.7520911 0.8002720 1.0047015 1.0146603
[7] 1.5045253 1.5460878 1.5702044 1.7963906
- %>%操作符不会将结果传递给原始的x1变量,而%<>%操作符会在计算完成后,将结果传递给原始变量x2。(可以仔细比对一下哦)
3.%T>%:会将左边的结果传递给右边进行一些运算,但不会返回运算后结果,只会返回原始的结果或者说上一级的结果。
> x3 %T>% abs %>% sort %>% print
[1] -1.5702044 -1.0047015 -0.4564930 0.4099607 0.7520911
[6] 0.8002720 1.0146603 1.5045253 1.5460878 1.7963906
- 从上述结果可以发现,和x1、x2经过管道传送之后的结果实在是差别太大了吧。abs函数的结果并没有传递到下一级函数中,传递的仍是x3的结果感觉这个函数好像什么存在感都木有,但事实证明好像还真是这样。好吧。
4.%$%:该操作符的左边通常不是一个变量,而是一个数据框或者列表,它可以将左边的矩阵或者数据框传递到右边的函数进行运算。
> data.frame(XX=x3) %$% ts.plot(XX)
- 左边产生一个以XX为列名的数据框,传递到右边画图函数,直接就可以读出XX所代表的数据。是不是很像attach函数或者ggplot中作图时的使用嘞。
5.%in%:该操作符的意思是匹配的含义,相当于R中的 match函数,其表达的意思是左边的元素在右边的向量中是否存在,如果存在则返回TRUE,否则返回FALSE。
> c(1,2,3,4)%in%c(1:10)
[1] TRUE TRUE TRUE TRUE
> c(1:10)%in%c(1,2,3,4)
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
- 主要是记住哪个在左,哪个在右,相当于将左边的样本与右边的标准进行匹配。
上述几个就是常用的,但管道函数可不只这些哦,如果大家想了解得更深入可以利用R的help(%<%)
来获取对应函数的解释文档哦。