R语言 使用管道,但不提供第一个参数

kiz8lqtg  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(136)

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

但是想用%>%找到解决方案...

qcbq4gxm

qcbq4gxm1#

%>%管道操作符是否总是将左侧(LHS)的参数传递给右侧(RHS)的第一个参数?即使第一个参数在RHS调用中被再次指定?
不。你自己也注意到了例外:如果右侧使用.,则左侧的第一个参数是 * not * feed in,需要手工传递。
然而,在您的案例中,这并没有发生,因为您并没有单独使用.,而是在表达式中使用它,为了避免左边的参数作为第一个参数,您还需要使用大括号:

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的第一个参数传递。

kmbjn2e3

kmbjn2e32#

可以使用匿名函数

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

# [1] -0.1175698

相关问题