什么|>(管道大于)R中的平均值?

k7fdbhmy  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(132)

我最近在R中遇到了代码|>。它是一个竖线字符(管道),后跟一个大于符号。
下面是一个例子:

mtcars |> head()

|>代码在做什么?

lx0bsm1f

lx0bsm1f1#

|>是基本的R "管道"操作符。它是new in version 4.1.0
简单地说,管道操作符提供操作符左手侧(LHS)的结果作为右手侧(RHS)的***第一个***参数。
请考虑以下几点:

1:3 |> sum()
#[1] 6

这里,数字1到3的向量作为sum函数的第一个参数提供。
左边的结果总是成为右边 * call * 的第一个参数。

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。

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
djmepvbi

djmepvbi2#

为了了解管道代码是如何被解析的,我们可以使用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)
wecizke3

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, ...)的变量组合使用

# 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)}

相关问题