不传递第一个参数使用管道

22

%>% 管道操作符是否总是将左侧(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)

但是想要找到一个使用 %>% 的解决方案...

3个回答

30

%>%管道操作符总是将左侧(LHS)的内容传递给右侧(RHS)的第一个参数吗?即使右侧的第一个参数在 RHS 调用中被指定了吗?

不是总是这样。您已经注意到了例外情况:如果右侧使用.,则左侧的第一个参数不会被传入。您需要手动传递它。

然而,在您的情况下,这不会发生,因为您不是单独使用 .,而是在表达式中使用它。为了避免将左侧作为第一个参数传递,您还需要使用大括号:

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

或者:

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

毕竟,这就是%$%的作用,与%>%不同。

但是请做一下比较:


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

在这里,我们将左侧表达式明确地作为lmdata参数传递。通过这样做,我们防止它作为第一个参数传递给lm


1
太好了!我漏掉了大括号,感谢你的解释!一开始提到 %$% 时打错字,实际上我是想说 %>% 的! - Matifou

3

可以使用匿名函数

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

# [1] -0.1175698

0
请查看pipeR包。这个包定义了%>>%运算符,以便您可以将lhs对象作为rhs函数中的.参数输入。
例如,假设lst是一个矩阵列表,并且您想要将它们全部cbind在一起。您可以这样做:lst %>>% {do.call(cbind, .)}

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接