在不输入第一个参数的情况下使用管道

Posted

技术标签:

【中文标题】在不输入第一个参数的情况下使用管道【英文标题】:Use pipe without feeding first argument 【发布时间】:2016-12-07 15:27:39 【问题描述】:

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

但想通过%>%找到解决方案...

【问题讨论】:

【参考方案1】:

%>% 管道运算符是否总是将左侧 (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 = .)

在这里,我们将左侧表达式作为data 参数显式传递给lm。通过这样做,我们可以防止它作为第一个参数传递给lm

【讨论】:

太棒了!我错过了支架,感谢您的解释!对不起,当我的意思是 %>% 时,最初提到 %$% 的错字!

以上是关于在不输入第一个参数的情况下使用管道的主要内容,如果未能解决你的问题,请参考以下文章

在不使用结构的情况下冒泡某种条件?

我们如何在不使用联合子句的情况下使用 rownum 显示给定表的第一行和最后一行

在不知道索引的情况下获取系列的第一个元素[重复]

如何在不丢失或复制任何记录的情况下移动或更改管道

如何在不更新整个固件的情况下使嵌入式系统可配置

有没有办法在不写查询中所有字段名称的情况下选择第一个表?