管道是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。管道%>% 来自于magrittr 包。因为tidyverse 中的包会自动加载%>%,所以一般我们不需要自己加载这个包。
library(magrittr)
有时候我们想实现某个功能,但是中间会有好几个步骤,产生不少无关变量。比如R数据科学中举的一个简单易懂的例子:
构建一个小兔子的对象:
foo_foo <- little_bunny()
兔子需要完成三个动作:
foo_foo_1 <- hop(foo_foo, through = forest)
foo_foo_2 <- scoop(foo_foo_1, up = field_mice)
foo_foo_3 <- bop(foo_foo_2, on = head)
在这个例子中,就产生了没有什么实际意义的中间变量,还必须用数字区分。这样很容易让人混淆,产生错误。
如果这样写:
foo_foo <- hop(foo_foo, through = forest)
foo_foo <- scoop(foo_foo, up = field_mice)
foo_foo <- bop(foo_foo, on = head)
每次都会覆盖掉以前的变量,但是这样如果出错,那么就必须重新跑。
有人可能也许会将函数组合起来:
bop(
scoop(
hop(foo_foo, through = forest),
up = field_mice
),
on = head
)
不过这样看起来真的累。
最后使用管道:
foo_foo %>%
hop(through = forest) %>%
scoop(up = field_mouse) %>%
bop(on = head)
管道对于一段比较短的线性操作序列是非常好使的,不过当步骤比较长(比如超过十个),或者有多个输入输出等时候,最好不要用管道。
举个简单小例子:
iris$Petal.Length %>% `+` (10) %>% plot(col = 'steelblue', pch = 4)
取出来iris的Petal.Length一列,并+10,最后画图点图。
网友评论