wang

1/18/2024

第73期

本文是作为学习笔记,学习R语言的官方管道符|>(4.1版本之后引入)和magrittr包的管道符%>%(目前我比较常用)的区别

总结一下:从功能性,简洁性来看,完全建议使用magrittr包的%>%管道符。

讨论来源:https://stackoverflow.com/questions/67633022/what-are-the-differences-between-rs-native-pipe-and-the-magrittr-pipe

概述

Topic

Magrittr 2.0.3

官方4.3.0

管道符

%>% %<>% %$% %!>% %T>%

|> (since 4.1.0)

函数调用差异

1:3 %>% sum()

1:3 |> sum()

1:3 %>% sum

官方的需要加括号

1:3 %>% +(4)

部分函数不支持

是否可以作为第一参数插入

mtcars %>% lm(formula = mpg ~ disp)

mtcars |> lm(formula = mpg ~ disp)

占位符号差异

.

_ (since 4.2.0)

mtcars %>% lm(mpg ~ disp, data = . )

mtcars |> lm(mpg ~ disp, data = _ )

mtcars %>% lm(mpg ~ disp, . )

需要提供参数名 data

1:3 %>% setNames(., .)

只能替代单次

1:3 %>% {sum(sqrt(.))}

不允许嵌套调用

提取调用(都比较符合)

mtcars %>% .$cyl
mtcars %>% {.$cyl[[3]]} or
mtcars %$% cyl[[3]]

mtcars |> _$cyl (since 4.3.0)
mtcars |> _$cyl[[3]]

是否可以创建函数

top6 <- . %>% sort() %>% tail()

无法实现

运行速度

由于函数调用多而运行慢

运行速度较快

详细说明

官方管道符使用需要有括号

library(magrittr)
1:3 |> sum
## Error: The pipe operator requires a function call as RHS (<text>:1:8)
1:3 |> sum()
## [1] 6
1:3 |> approxfun(1:3, 4:6)()
## [1] 4 5 6
1:3 %>% sum
## [1] 6
1:3 %>% sum()
## [1] 6
1:3 %>% approxfun(1:3, 4:6) 
## Error in if (is.na(method)) stop("invalid interpolation method"): the condition has length > 1
1:3 %>% approxfun(1:3, 4:6)()
## [1] 4 5 6

官方管道符一些函数无法调用,可使用::调用或加括号调用

1:3 |> `+`(4)
## Error: function '+' not supported in RHS call of a pipe (<text>:1:8)
1:3 |> (`+`)(4)
## [1] 5 6 7
1:3 |> base::`+`(4)
## [1] 5 6 7

官方管道符的占位符一定需要加上参数名

2 |> setdiff(1:3, _)
## Error: pipe placeholder can only be used as a named argument (<text>:1:6)
2 |> setdiff(1:3, y = _)
## [1] 1 3

可变参数函数使用官方管道符

可变参数函数是那些能够接受可变数量的参数的函数,需要添加`.`做参数名

"b" |>  paste("a", _, "c")
## Error: pipe placeholder can only be used as a named argument (<text>:1:9)
"b" |>  paste("a", . = _, "c")
## [1] "a b c"

官方管道符的参数占位符只能调用一次

1:3 |> setNames(nm = _)
## 1 2 3 
## 1 2 3
1:3 |> setNames(object = _, nm = _)
## Error: pipe placeholder may only appear once (<text>:1:8)

官方管道符不支持嵌套调用

1:3 |> sum(sqrt(x=_))
## Error: invalid use of pipe placeholder (<text>:1:0)
1:3 |> (\(.) sum(sqrt(.)))()
## [1] 4.146264
#[1] 4.146264

提取调用

自 4.3.0 起的试验性功能。现在,占位符 _ 也可以作为提取调用的第一个参数,用于正向管道 |> 表达式的 rhs 中,例如 _$coef。更广泛地说,它可以用作提取链的首参数,例如 _$coef[[2]]

但%>%一直支持

创建函数

%>%支持直接创建新函数,官方管道符不支持

top6 <- . %>% sort() %>% tail()
top6(c(1:10,10:1))
## [1]  8  8  9  9 10 10
#[1]  8  8  9  9 10 10