使用管道而不提供第一个参数

问题描述 投票:0回答:3

%>%
管道运算符是否始终将左侧(LHS)提供给右侧(RHS)的第一个参数?即使在 RHS 调用中再次指定第一个参数?

假设我想指定在

cor()
中使用哪个变量:

library(magrittr)
iris  %>%
  cor(x=.$Sepal.Length, y=.$Sepal.Width)

但这失败了,看起来它调用了类似

cor(., x=.$Sepal.Length, y=.$Sepal.Width)
的东西?

我知道我可以用它来代替

iris  %$%
  cor(x=Sepal.Length, y=Sepal.Width)

但想找到解决方案

%>%
...

r pipe magrittr
3个回答
30
投票

%>%
管道运算符是否始终将左侧(LHS)提供给右侧(RHS)的第一个参数?即使在 RHS 调用中再次指定第一个参数?

不。您自己已经注意到了这个异常:如果右侧使用

.
,则左侧的第一个参数是 not 传入的。您需要手动传递它。

但是,这在您的情况下“不会”发生,因为您本身没有使用 .,而是在表达式中使用它。为了避免左侧作为第一个参数输入,您还需要使用大括号:


iris %>% {cor(x = .$Sepal.Length, y = .$Sepal.Width)}

或者:

iris %$% cor(x = Sepal.Length, y = Sepal.Width)

—毕竟,这就是 
%$%

的用途,而不是

%>%

但是比较一下:

iris %>% lm(Sepal.Width ~ Sepal.Length, data = .)

在这里,我们将左侧表达式显式作为 
data

参数传递给

lm
。通过这样做,我们可以防止它作为第一个参数传递给
lm
    


3
投票

magrittr

管子

library(magrittr)
iris %>% 
  (\(.) cor(x = .$Sepal.Length, y = .$Sepal.Width))

# [1] -0.1175698

base

管子

iris |>
 (\(.) cor(x = .$Sepal.Length, y = .$Sepal.Width))()

# [1] -0.1175698



0
投票
pipeR

包装。这个包定义了 %>>% 运算符,以便您可以将 lhs 对象作为 rhs 函数中的

.
参数输入。
例如,假设 

lst

是一个矩阵列表,并且您想要

cbind
所有矩阵。你可以这样做:
lst %>>% {do.call(cbind, .)}
    

© www.soinside.com 2019 - 2024. All rights reserved.