在不提供第一个参数的情况下使用管道
Use pipe without feeding first argument
%>%
管道运算符是否总是将左侧 (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)
但想找到一个解决方案 %>%
...
Is the %>%
pipe operator always feeding the left-hand side (LHS) to the first argument of the right-hand side (RHS)? Even if the first argument is specified again in the RHS call?
没有。您自己已经注意到异常:如果右侧使用 .
,则左侧的第一个参数是 not fed 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
.
%>%
管道运算符是否总是将左侧 (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)
但想找到一个解决方案 %>%
...
Is the
%>%
pipe operator always feeding the left-hand side (LHS) to the first argument of the right-hand side (RHS)? Even if the first argument is specified again in the RHS call?
没有。您自己已经注意到异常:如果右侧使用 .
,则左侧的第一个参数是 not fed 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
.