barnett874 速度一样是不可能的,这辈子都不会一样的。|>
是从语法解析器层面实现的,把 x |> f()
直接解析为 f(x)
,也就是 x |> f()
的速度几乎与直接运行 f(x)
一样;而 %>%
则没这么直接,它还要做一箩筐其它的事情。
chuxinyuan 我的理解是 %>%
的实现太复杂了,规则太多;而 |>
的实现干净利落,有且仅有一条规则,就是我上面说的,比如它要求管道右边必须是一个函数调用,而不能是裸函数,而 %>%
则二者皆可。
1:10 %>% head
1:10 %>% head()
1:10 |> head # 这不可以
1:10 |> head()
|>
也不支持 %>%
发明的占位符 .
。要用占位符的话,只能显式地写一个函数,不过可以是简写版的匿名函数,如 \(.) head(., 8)
,也就是一条反斜杠代替了 function
关键字。不过说实话我到现在仍然不习惯这个反斜杠,因为它在我脑子里根深蒂固成了转义符的代表,视觉上我很难把 \(x)
与 function(x)
等价起来。
最后,不管是哪种管道,我个人对它们都并不是很热衷。%>%
的排错(debug)之麻烦,让我觉得简直难以忍受;若真能一气呵成写出一条管道,那皆大欢喜,而万一要是写不对,要查出是哪里错了,则麻烦得要死,所以我宁愿用结硬寨、打呆仗的办法写代码,哪怕这种呆办法被管道党一次次嘲弄。
x = 1:10
x = head(x)
因为 |>
的实现原理简单,所以出错后排错要容易得多,可以使用常见的排错手段,如 debug()
函数。