繁体   English   中英

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

[英]How to use `package::function()` inside a package when `function` is an infix operator?

根据H. Wickham的《 R Packages》一书,在“ Package Metadata”一章中,有关如何添加软件包依赖关系,Hadley指出了充分的理由使用语法package::function()显式引用外部函数。

在此处添加软件包依赖项可确保将其安装。 但是,这并不意味着它将与您的软件包(即library(x))一起附加。 最佳实践是使用语法package :: function()显式引用外部函数 这样可以很容易地确定哪些功能在您的程序包之外。 这在以后阅读代码时特别有用。

R包| 包元数据

但是,如果function是中缀运算符,该怎么办? 例如,似乎我无法执行1:10 magrittr::"%>%" sqrt吗? 并且在这里采用函数样式会违背使用管道运算符的目的……不是吗?

我认为,仅使用从magrittr导入的内容,您会很安全。 但是,如果您愿意,可以通过执行以下操作来确保您的符号指向您想要的符号

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

您不能将package::infix用于infix语法,但是可以将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 ,或至少导入"%>%"


您引用的来源足以说明此最佳实践背后的一些原因:

这样可以很容易地确定哪些功能在您的程序包之外。 这在以后阅读代码时特别有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM