将对象通过管道转发到函数或调用表达式中。
细节
配售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
。
技术说明
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 magrittr pipe-eager 热切的管子
- R magrittr exposition 展览管
- R magrittr tee 三通管
- R magrittr compound 分配管道
- R matrix转list用法及代码示例
- R SparkR match用法及代码示例
- R vcov.gam 从 GAM 拟合中提取参数(估计器)协方差矩阵
- R gam.check 拟合 gam 模型的一些诊断
- R as 强制对象属于某个类
- R null.space.dimension TPRS 未惩罚函数空间的基础
- R language-class 表示未评估语言对象的类
- R gam.reparam 寻找平方根惩罚的稳定正交重新参数化。
- R className 类名包含对应的包
- R modelr typical 求典型值
- R extract.lme.cov 从 lme 对象中提取数据协方差矩阵
- R scat 用于重尾数据的 GAM 缩放 t 系列
- R choldrop 删除并排名第一 Cholesky 因子更新
- R smooth.construct.cr.smooth.spec GAM 中的惩罚三次回归样条
- R modelr resample “惰性”重采样。
- R bandchol 带对角矩阵的 Choleski 分解
- R BasicClasses 基本数据类型对应的类
- R gam.side GAM 的可识别性边条件
- R cox.ph 附加 Cox 比例风险模型
- R callGeneric 从方法调用当前通用函数
- R mgcv.parallel mgcv 中的并行计算。
注:本文由纯净天空筛选整理自Stefan Milton Bache等大神的英文原创作品 Pipe。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。