【上一篇:69.关于编程技巧的提升开篇】
【下一篇:71.关于自定义函数的格式】
%>%管道符来自magrittr包,当你加载tidyverse或者其中的包时,默认就加载了magrittr包,所以不需要显式加载它(即不需要写library(magrittr))。
%>%管道符的数据流向永远还是从左到右:左边接收的数据是dataframe,相关函数也是基于dataframe上下文运算的,右边产生输出。
magrittr包中还有其他的管道符工具:
tee pipe:%T>%:这个管道符的作用是从左边输出结果。这个管道符在输出%>%数据流中的中间结果时很有用。Linux中tee这个命令的作用是接收标准输入中的内容并输出到一个文件中,所以这里的>左边的T可以理解为数据从左边输出。举个例子进行理解:
# 仅能输出图片
> rnorm(100) %>% matrix(ncol=2) %>% plot()
# 不仅可以输出图片,还能输出matrix(ncol=2)这一步运算的结果
> rnorm(100) %>% matrix(ncol=2) %T>% plot()
[,1] [,2]
[1,] -0.87700992 1.39604385
[2,] 1.58121476 1.65187233
[3,] 1.12273586 -0.29236723
[4,] -0.31387044 -0.01109105
[5,] 0.59658100 1.82012854
[6,] 0.13129411 -0.22548507
[7,] 0.26499393 1.09355074
[8,] -1.34242165 1.48584774
[9,] -1.27116588 0.63586910
[10,] 0.63694253 -1.07387373
%$%:这个管道符中有个$,$可以代表引用,所以这个管道符的作用是:打破数据框中的变量,以便可以单独引用数据框中的变量。举个例子理解:
# %>%的数据流是基于dataframe上下文环境工作的,cor()函数只能接收向量,不能接收数据框
> mtcars %>% cor(disp,mpg)
Error in cor(., disp, mpg) : invalid 'use' argument
In addition: Warning message:
In if (is.na(na.method)) stop("invalid 'use' argument") :
the condition has length > 1 and only the first element will be used
# %$%可以让我们直接引用数据框中的变量
> mtcars %$% cor(disp,mpg)
[1] -0.8475514
%<>%:覆盖原始数据管道符,举个例子:
> mtcars <-mtcars %>% transform(cyl=cyl*2)
# 下面这条命令可以代替上面这条
> mtcars %<>% transform(cyl=cyl*2)
管道符很好用,但也不要滥用。代码以清晰、便于理解交流为主,当pipe中的步骤超过10步的时候尽量不要用管道符了;管道符比较适合输入只有一个的时候,当你有多个输入对象和输出的时候,也不要太勉强自己用管道符了,容易出错,得不偿失。
网友评论