当`function`是一个中缀运算符时,如何在包里面使用`package :: function()`?

时间:2017-03-23 16:43:41

标签: r magrittr infix-operator

根据H. Wickham的书 R Packages ,在Package Metadata一章中,关于如何添加包依赖,Hadley指出了明确引用外部函数的充分理由语法package::function()

  

在此处添加包依赖项可确保将其安装。但是,这并不意味着它将与您的包一起附加(即库(x))。 最佳做法是使用语法package :: function()显式引用外部函数。这样可以非常轻松地识别出包装外的哪些功能。这在将来阅读代码时特别有用。

来自R Packages | Package metadata

但是当function是中缀运算符时怎么做?例如,似乎我不能1:10 magrittr::"%>%" sqrt?并且在这里采用函数样式会违背使用管道运算符的目的......不是吗?

2 个答案:

答案 0 :(得分:2)

我认为你只需要使用magrittr的导入就可以了。但如果你想要,你可以确保你的符号指的是你想做的那个

your_fun <- function(){
  `%>%` <- magrittr::`%>%`
  # now use %>% like you normally would
  # and you can be sure it refers to the magrittr version.
  return(42)
}

答案 1 :(得分:2)

您不能将package::infix与中缀语法一起使用,但您可以使用具有标准语法的中缀运算符。例如:

"+"(1, 2)
# [1] 3

Hmisc::"%nin%"(1:3, 2)
# [1]  TRUE FALSE  TRUE

不幸的是,当软件包没有加载时,这不适用于magrittr,可能是由于它的替换技巧。

## what a shame that this beauty doesn't work:
magrittr::"%>%"(1:5, mean)
# Error in pipes[[i]] : subscript out of bounds

library(magrittr)
"%>%"(1:5, mean)
# [1] 3

在程序包上下文中,我建议您只导入magrittr,或者至少导入"%>%"

您引用的来源足以解释这种最佳做法背后的一些原因:

  

这样可以很容易地识别出包装外的哪些功能。这在将来阅读代码时特别有用。

在这种情况下,这似乎并不适用。您不太可能忘记%>%来自哪里或错误地认为它是在您的包中创建的。