我最近在R中遇到了代码|>。它是一个竖线字符(管道),后跟一个大于符号。下面是一个例子:
|>
mtcars |> head()
|>代码在做什么?
lx0bsm1f1#
|>是基本的R "管道"操作符。它是new in version 4.1.0。简单地说,管道操作符提供操作符左手侧(LHS)的结果作为右手侧(RHS)的***第一个***参数。请考虑以下几点:
1:3 |> sum() #[1] 6
这里,数字1到3的向量作为sum函数的第一个参数提供。左边的结果总是成为右边 * call * 的第一个参数。
sum
args(sum) #function (..., na.rm = FALSE) c(1:3, NA_real_) |> sum(na.rm = TRUE) #[1] 6
强调 * call * 非常重要,因为只要第一个参数是named,就可以将LHS重定向到其他参数。
args(rnorm) #function (n, mean = 0, sd = 1) 100 |> rnorm(n = 5) #[1] 99.94718 99.93527 97.46838 97.38352 100.56502 args(sum) #function (..., na.rm = FALSE) sum(na.rm = TRUE, ... = c(1:2,NA_real_)) #[1] 3 TRUE |> sum(... = c(1:2,NA_real_)) #[1] NA
使用|>运算符的一个好处是,与嵌套函数调用相比,它可以使代码在逻辑上更容易遵循:
split(x = iris[-5], f = iris$Species) |> lapply(min) |> do.call(what = rbind) # [,1] #setosa 0.1 #versicolor 1.0 #virginica 1.4 #Compared to: do.call(rbind,lapply(split(iris[-5],iris$Species),min))
此功能类似于magrittr::%>%运算符(也在dplyr中实现)。但是,与%>%不同,目前没有方法将LHS多次插入右侧或任意放置,Magrittr使用.占位符来放置LHS,并使用{}来任意放置LHS。
magrittr::%>%
dplyr
%>%
.
{}
library(magrittr) iris[iris$Sepal.Length > 7,] %>% subset(.$Species=="virginica") TRUE %>% {sum(c(1:2,NA_real_),na.rm = .)} [1] 3
此外,与基本R |>不同,%>%操作符可以在没有()的情况下通过管道传递到函数调用中:
()
1:3 |> sum #Error: The pipe operator requires a function call as RHS 1:3 %>% sum #[1] 6
djmepvbi2#
为了了解管道代码是如何被解析的,我们可以使用quote()。
quote()
quote(1:3 |> sum()) # sum(1:3) quote(100 |> rnorm(n = 5)) # rnorm(100, n = 5) quote(split(x = iris[-5], f = iris$Species) |> lapply(min) |> do.call(what = rbind)) # do.call(lapply(split(x = iris[-5], f = iris$Species), min), what = rbind)
wecizke33#
由于我最近也在一个对等体的代码中偶然发现了这个管道,我研究了这个主题,发现从R 4.2起,您还可以在任意位置(但是,不是多次,而是一次)使用不同的语法将LHS管道传输到右侧:自R 4.2起:可以将|>与_结合使用这意味着,基R也可以做magittr所做的一些事情:
_
# magittr TRUE %>% {sum(c(1:2,NA_real_),na.rm = .)} # R 4.2 onwards TRUE |> {sum(c(1:2,NA_real_),na.rm = _)}
从R 4.1开始,您已经可以使用=>和一个通过管道传输到|> a => f(..., x = a, ...)的变量组合使用
=>
|> a => f(..., x = a, ...)
# R 4.1 onwards # you have to set the '_R_USE_PIPEBIND_' envvar to a true value to enable => Sys.setenv("_R_USE_PIPEBIND_"=TRUE) TRUE |> a => {sum(c(1:2,NA_real_),na.rm = a)}
3条答案
按热度按时间lx0bsm1f1#
|>
是基本的R "管道"操作符。它是new in version 4.1.0。简单地说,管道操作符提供操作符左手侧(LHS)的结果作为右手侧(RHS)的***第一个***参数。
请考虑以下几点:
这里,数字1到3的向量作为
sum
函数的第一个参数提供。左边的结果总是成为右边 * call * 的第一个参数。
强调 * call * 非常重要,因为只要第一个参数是named,就可以将LHS重定向到其他参数。
使用
|>
运算符的一个好处是,与嵌套函数调用相比,它可以使代码在逻辑上更容易遵循:此功能类似于
magrittr::%>%
运算符(也在dplyr
中实现)。但是,与
%>%
不同,目前没有方法将LHS多次插入右侧或任意放置,Magrittr使用.
占位符来放置LHS,并使用{}
来任意放置LHS。此外,与基本R
|>
不同,%>%
操作符可以在没有()
的情况下通过管道传递到函数调用中:djmepvbi2#
为了了解管道代码是如何被解析的,我们可以使用
quote()
。wecizke33#
由于我最近也在一个对等体的代码中偶然发现了这个管道,我研究了这个主题,发现从R 4.2起,您还可以在任意位置(但是,不是多次,而是一次)使用不同的语法将LHS管道传输到右侧:
自R 4.2起:可以将
|>
与_
结合使用这意味着,基R也可以做magittr所做的一些事情:
从R 4.1开始,您已经可以使用
=>
和一个通过管道传输到|> a => f(..., x = a, ...)
的变量组合使用