R 的新原生管道 `` 和 magrittr 管道 `%%` 有什么区别

作者:编程家 分类: ruby 时间:2025-12-23

R的新原生管道`|>`和magrittr管道`%>%`是两种不同的管道操作符,它们在功能和使用上有一些区别。

首先,我们来看一下`|>`管道操作符。该操作符是R语言自版本4.1.0起引入的新特性。它的作用是将前一个表达式的结果作为参数传递给后一个表达式,并将后一个表达式的结果作为整个管道的结果返回。这种管道操作符的特点是将数据在管道中从左到右传递,类似于Unix命令中的管道操作符`|`。

与之相比,magrittr管道`%>%`是由magrittr包提供的一种管道操作符。它的作用也是将前一个表达式的结果作为参数传递给后一个表达式,并将后一个表达式的结果作为整个管道的结果返回。不同的是,magrittr管道的使用方式更加灵活,可以使用多个表达式进行链式操作,还可以使用`.`符号引用前一个表达式的结果。

下面我们来比较一下这两种管道操作符的使用方式和功能。

### 1. 使用方式

`|>`管道操作符的使用方式比较简单,只需要在前一个表达式后面加上`|>`,然后跟上后一个表达式即可。例如:

R

# 使用 |> 管道操作符

result <- data |> filter(x > 0) |> summarise(mean(y))

而magrittr管道的使用方式稍微复杂一些,需要将前一个表达式放在`%>%`的左侧,后一个表达式放在`%>%`的右侧。例如:

R

# 使用 %>% 管道操作符

result <- data %>% filter(x > 0) %>% summarise(mean(y))

### 2. 链式操作

magrittr管道操作符`%>%`支持多个表达式的链式操作,即将多个操作依次串联起来。这种链式操作的好处是可以写出更加清晰、易读的代码。例如:

R

# 使用 %>% 管道操作符进行链式操作

result <- data %>%

filter(x > 0) %>%

group_by(category) %>%

summarise(mean(y))

而`|>`管道操作符目前不支持多个表达式的链式操作,只能一次性传递前一个表达式的结果给后一个表达式。如果需要进行多个操作,需要使用多个`|>`操作符。例如:

R

# 使用 |> 管道操作符进行多个操作

result <- data |>

filter(x > 0) |>

group_by(category) |>

summarise(mean(y))

### 3. 使用`.`引用前一个表达式的结果

在magrittr管道中,可以使用`.`符号引用前一个表达式的结果。这样可以避免重复输入前一个表达式的结果。例如:

R

# 使用 %>% 管道操作符引用前一个表达式的结果

result <- data %>%

filter(x > 0) %>%

mutate(y = y - mean(.$y))

而`|>`管道操作符不支持使用`.`引用前一个表达式的结果,需要使用其他方式来传递前一个表达式的结果。例如:

R

# 使用 |> 管道操作符传递前一个表达式的结果

result <- data |>

filter(x > 0) |>

{.$y <- .$y - mean(.$y); .}

### 4. 兼容性

magrittr管道`%>%`是一个非常流行的管道操作符,已经被广泛应用于许多R包和代码库中。而`|>`管道操作符是R语言自带的新特性,需要R版本4.1.0以上的支持。因此,在选择使用管道操作符时,需要考虑到代码的兼容性。

`|>`管道操作符和magrittr管道`%>%`虽然在功能和使用上有一些区别,但都是为了实现更加简洁、易读的管道操作。选择使用哪种管道操作符可以根据个人的喜好和需求来决定。

案例代码:

R

library(dplyr)

# 创建一个数据框

data <- data.frame(x = c(1, 2, 3, 4, 5), y = c(10, 20, 30, 40, 50), category = c("A", "B", "A", "B", "A"))

# 使用 |> 管道操作符进行链式操作

result1 <- data |>

filter(x > 0) |>

group_by(category) |>

summarise(mean(y))

# 使用 %>% 管道操作符进行链式操作

result2 <- data %>%

filter(x > 0) %>%

group_by(category) %>%

summarise(mean(y))

# 打印结果

print(result1)

print(result2)

以上是关于R的新原生管道`|>`和magrittr管道`%>%`的介绍,包括它们的使用方式、链式操作、使用`.`引用前一个表达式的结果和兼容性。根据个人的喜好和需求,选择适合自己的管道操作符可以使代码更加简洁、易读。