当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R magrittr pipe 管道


将对象通过管道转发到函数或调用表达式中。

用法

lhs %>% rhs

参数

lhs

值或 magrittr 占位符。

rhs

使用 magrittr 语义的函数调用。

细节

使用%>%使用一元函数调用

当函数仅需要一个参数时,x %>% f 等效于 f(x)(并不完全等效;请参阅下面的技术说明。)

配售lhs作为第一个参数rhs称呼

rhs 调用中需要多个参数时,%>% 的默认行为是将 lhs 作为第一个参数,即 x %>% f(y) 相当于 f(x, y)

配售lhs其他地方在rhs称呼

通常,您会希望 lhs 在第一个位置以外的其他位置调用 rhs。为此,您可以使用点 (.) 作为占位符。例如,y %>% f(x, .) 相当于 f(x, y)z %>% f(x, y, arg = .) 相当于f(x, y, arg = z)

将点用于次要目的

通常,除了 lhs 本身的值之外,rhs 调用中还需要 lhs 的某些属性或特性,例如行数或列数。在 rhs 调用中多次使用点占位符是完全有效的,但根据设计,在嵌套函数调用中使用它时,行为略有不同。特别是,如果占位符仅在嵌套函数调用中使用,lhs 也将被放置为第一个参数!原因是在大多数 use-cases 中,这会产生最具可读性的代码。例如,iris %>% subset(1:nrow(.) %% 2 == 0) 相当于iris %>% subset(., 1:nrow(.) %% 2 == 0),但稍微更紧凑。可以通过将 rhs 用大括号括起来来否决此行为。例如, 1:10 %>% {c(min(.), max(.))} 相当于 c(min(1:10), max(1:10))

使用%>%与调用-或function-producingrhs

可以在 lhs 的管道化发生之前强制评估 rhs。当 rhs 生成相关调用或函数时,这非常有用。要首先评估 rhs ,请将其括在括号中,即 a %>% (function(x) x^2)1:10 %>% (call("sum")) 。与此相关的另一个示例是使用 $ 运算符访问的引用类方法,其中可以执行 x %>% (rc$f) ,而不是 x %>% rc$f

使用 lambda 表达式%>%

每个rhs本质上是一元函数的one-expression主体。因此,在 magrittr 中定义 lambda 是非常自然的,就像常规函数的定义一样:如果需要多个表达式,则将表达式主体括在一对大括号中, { rhs } 。但是,请注意,大括号内没有“first-argument 规则”:这与编写参数名称为“.”(点)的一元函数完全相同。

使用 dot-place 支架作为lhs

当点用作 lhs 时,结果将是一个函数序列,即依次将整个右侧链应用到其输入的函数。请参阅示例。

技术说明

magrittr 管道运算符使用非标准评估。他们捕获他们的输入并检查它们以找出如何继续。首先,从所有单独的右侧表达式生成一个函数,然后通过将该函数应用于左侧来获得结果。对于大多数目的,人们可以忽略 magrittr 求值的微妙方面,但某些函数可能会捕获其调用环境,因此使用运算符不会完全等同于没有 pipe-operators 的 "standard call"。

另一个注意事项是,在 pipe-chain(+, -, $, 等)中使用非 magrittr 运算符时建议特别注意,因为运算符优先级将影响链的评估方式。一般来说,建议使用 magrittr 提供的别名。

也可以看看

%<>% , %T>% , %$%

例子

# Basic use:
iris %>% head
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa

# Use with lhs as first argument
iris %>% head(10)
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1           5.1         3.5          1.4         0.2  setosa
#> 2           4.9         3.0          1.4         0.2  setosa
#> 3           4.7         3.2          1.3         0.2  setosa
#> 4           4.6         3.1          1.5         0.2  setosa
#> 5           5.0         3.6          1.4         0.2  setosa
#> 6           5.4         3.9          1.7         0.4  setosa
#> 7           4.6         3.4          1.4         0.3  setosa
#> 8           5.0         3.4          1.5         0.2  setosa
#> 9           4.4         2.9          1.4         0.2  setosa
#> 10          4.9         3.1          1.5         0.1  setosa

# Using the dot place-holder
"Ceci n'est pas une pipe" %>% gsub("une", "un", .)
#> [1] "Ceci n'est pas un pipe"
  
# When dot is nested, lhs is still placed first:
sample(1:10) %>% paste0(LETTERS[.])
#>  [1] "1A"  "10J" "2B"  "9I"  "8H"  "3C"  "4D"  "5E"  "6F"  "7G" 

# This can be avoided:
rnorm(100) %>% {c(min(.), mean(.), max(.))} %>% floor
#> [1] -3 -1  2

# Lambda expressions: 
iris %>%
{
  size <- sample(1:10, size = 1)
  rbind(head(., size), tail(., size))
}
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1            5.1         3.5          1.4         0.2    setosa
#> 2            4.9         3.0          1.4         0.2    setosa
#> 3            4.7         3.2          1.3         0.2    setosa
#> 4            4.6         3.1          1.5         0.2    setosa
#> 5            5.0         3.6          1.4         0.2    setosa
#> 6            5.4         3.9          1.7         0.4    setosa
#> 7            4.6         3.4          1.4         0.3    setosa
#> 8            5.0         3.4          1.5         0.2    setosa
#> 143          5.8         2.7          5.1         1.9 virginica
#> 144          6.8         3.2          5.9         2.3 virginica
#> 145          6.7         3.3          5.7         2.5 virginica
#> 146          6.7         3.0          5.2         2.3 virginica
#> 147          6.3         2.5          5.0         1.9 virginica
#> 148          6.5         3.0          5.2         2.0 virginica
#> 149          6.2         3.4          5.4         2.3 virginica
#> 150          5.9         3.0          5.1         1.8 virginica

# renaming in lambdas:
iris %>%
{
  my_data <- .
  size <- sample(1:10, size = 1)
  rbind(head(my_data, size), tail(my_data, size))
}
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1            5.1         3.5          1.4         0.2    setosa
#> 2            4.9         3.0          1.4         0.2    setosa
#> 3            4.7         3.2          1.3         0.2    setosa
#> 4            4.6         3.1          1.5         0.2    setosa
#> 5            5.0         3.6          1.4         0.2    setosa
#> 6            5.4         3.9          1.7         0.4    setosa
#> 7            4.6         3.4          1.4         0.3    setosa
#> 8            5.0         3.4          1.5         0.2    setosa
#> 9            4.4         2.9          1.4         0.2    setosa
#> 10           4.9         3.1          1.5         0.1    setosa
#> 141          6.7         3.1          5.6         2.4 virginica
#> 142          6.9         3.1          5.1         2.3 virginica
#> 143          5.8         2.7          5.1         1.9 virginica
#> 144          6.8         3.2          5.9         2.3 virginica
#> 145          6.7         3.3          5.7         2.5 virginica
#> 146          6.7         3.0          5.2         2.3 virginica
#> 147          6.3         2.5          5.0         1.9 virginica
#> 148          6.5         3.0          5.2         2.0 virginica
#> 149          6.2         3.4          5.4         2.3 virginica
#> 150          5.9         3.0          5.1         1.8 virginica

# Building unary functions with %>%
trig_fest <- . %>% tan %>% cos %>% sin

1:10 %>% trig_fest
#>  [1]  0.0133878 -0.5449592  0.8359477  0.3906486 -0.8257855  0.8180174
#>  [7]  0.6001744  0.7640323  0.7829771  0.7153150
trig_fest(1:10)
#>  [1]  0.0133878 -0.5449592  0.8359477  0.3906486 -0.8257855  0.8180174
#>  [7]  0.6001744  0.7640323  0.7829771  0.7153150

源代码:R/pipe.R

相关用法


注:本文由纯净天空筛选整理自Stefan Milton Bache等大神的英文原创作品 Pipe。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。