R原生管道符|>与magrittr管道符%>%有哪些区别?
R 原生管道
|>与magrittr管道%>%的核心区别及坑点汇总 - 函数必须带括号,不支持裸函数名调用
这是最基础的差异,%>%支持直接写裸函数名,比如2 %>% sqrt可以正常返回结果,但|>要求右侧必须是完整的函数调用表达式,必须写为2 |> sqrt(),传入自定义函数时同样遵循该规则。 - 占位符规则更严格,不同版本兼容性差异大
- R 4.1版本的原生管道完全没有占位符功能,左侧的返回值只能传递给右侧函数的第一个参数,无法自定义传入位置
- R 4.2版本才引入
_作为官方占位符,且要求_必须作为命名参数的值使用,不能用于非命名的位置,也不允许在同一个函数调用里多次使用_
举例:mtcars |> lm(mpg ~ cyl, data = _)是合法写法,但1 |> paste("a", _, "b")、c(1,2) |> paste(_, _)都会直接报错,而%>%使用.作为占位符没有这些限制。
- 无内置特殊管道语法,副作用操作、字段提取需要手动实现
magrittr包提供了%T>%(tee管道,用于执行打印、绘图等副作用同时保留原传入值)、%$%(提取管道,直接调用传入对象的内部字段/元素)等扩展管道语法,原生管道没有对应的内置实现,需要手动封装匿名函数实现同等功能:
字段提取也需要手动调用# magrittr实现tee管道效果 mtcars %T>% plot(mpg ~ cyl) %>% summarise(avg_mpg = mean(mpg)) # 原生管道等价写法 mtcars |> {\(x) {plot(mpg ~ cyl, data = x); x}}() |> (\(x) data.frame(avg_mpg = mean(x$mpg)))()with或者$:# magrittr字段提取写法 mtcars %$% cor(mpg, cyl) # 原生管道等价写法 mtcars |> with(cor(mpg, cyl)) - 代码块调用规则不同
%>%支持直接在大括号代码块中用.指代传入值,原生管道没有默认的.变量,必须显式定义匿名函数的参数来接收传入值:# magrittr代码块写法 2 %>% { a <- 3 . + a } # 原生管道等价写法 2 |> {\(x) { a <- 3 x + a }}() - 低版本R环境兼容性问题
原生管道是R 4.1才推出的功能,如果你的代码需要兼容R 4.0及更早的版本,完全不能使用|>,而%>%只要安装了magrittr包(或者tidyverse系列包)就可以在所有主流R版本中运行。
内容的提问来源于stack exchange,提问作者sieste
相关产品推荐
相关产品推荐

