在R中不加载dplyr,使用%>%运算符

28

我目前正在构建一个包,并想知道是否有一种方法可以在不实际加载dplyr包的情况下调用dplyr中的%>%运算符。例如,对于任何从包中导出的函数,您都可以使用双冒号(::)调用它。因此,如果我想在不附加dplyr的情况下使用group_by函数,则应输入dplyr::group_by。那么操作符是否也有类似的方法呢?


6
我认为 %>% 函数实际上是从 'pkg:magrittr' 导入的。您需要引用或使用反引号来使用 %>% - IRTFM
1
你需要使用 magrittr::\%>%``。 - Andrie
4个回答

50
你可以将任何非标准命名的对象用反引号括起来进行引用。这意味着你可以这样做:
`%>%` <- magrittr::`%>%`

这将在您当前的环境中定义%>%运算符。例如:

iris %>% head

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

10

最简单的方法是加载magrittr包,它只用于管道操作,并且是%>% 的原始源代码。如果您不想加载任何软件包,则仍然可以使用%>% ,但不会有任何真正有用的方式(除非您按照Andrie的建议在环境中定义它)。使用它和::结合使用的方法如下:

# standard use
mtcars %>% summary()
# :: use
magrittr::"%>%"(mtcars, summary())

使用这种方法,你真的失去了可读性和不嵌套的任何优势。

既然你说你正在构建一个包,你应该将magrittr放在Imports中,甚至只需要使用importsFrom并获取"%>%"函数。有关更多信息,请参见此处


3
如果您已安装但未加载“dplyr”,则可以使用以下命令获取结果:

 dplyr::`%>%`   # Note the backticks, although quotes work as well.

这会显示代码,但底部你将看到它的环境实际上是'dplyr'导入的'magritter'的NAMESPACE。正如其他两位知识渊博的回答者所指出的那样,有几种方法可以将其用作函数,尽管除非你制作具有两侧“%”的本地副本或使用函数括号调用它,否则不能将其置于lhsrhs参数之间。R解析器不允许:

>  mtcars dplyr::"%>%" summary()
Error: unexpected symbol in " mtcars dplyr"

0

在dplyr中实现的管道符号和双冒号符号之间似乎存在冲突。我在文档中没有找到任何相关信息。

## This works:
base::mean(1:10)

## This doesn't:
1:10 %>% base::mean

## It works after parenthesizing though:
1:10 %>% (base::mean)

文档中可以更加突出地呈现这个问题。

此问题由romainfrancois从tidyverse/dplyr#3958移动而来。

来源:https://github.com/tidyverse/magrittr/issues/183


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