[英]Are binary operators / infix functions in R generic? And how to make use of?
[英]R: How to best import infix operators like %>% into my package?
我正在制作一个 R-Package,我正在努力导入中缀函数,如%>%
、 :=
或%dopar%
。
在DESCRIPTION
文件中,我使用Imports: <otherPackage>
(例如Imports: doParallel
)概念。 Within the code I use the package::function()
(eg dplyr::mutate()
) notion, which seems to work ( R CMD check
is pleased) but how do I import infix functions?
@importFrom
(eg #' @importFrom magrittr %>%
) roxygen 方式似乎适用于%>%
、 :=
和%dopar%
。 但由于它被复制到NAMSEPACE
文件中,将@importFrom
添加到一个 function 解决了包范围内的问题,这似乎相当“hacky”。
将此类功能导入我的 package 的最佳做法是什么?
我不确定在这种情况下是否有一个最佳实践。 使用@importFrom
更新NAMESPACE
文件确实是一个包范围的指令,但我从未遇到过有问题的 package 或避免它的原因。 如果您愿意,可以使用相同的@importFrom
指令注释多个函数,表示哪些函数使用哪些导入,并且不会引起任何冲突; 不过,这完全取决于您,一个就足够了。 使用@import
可能会令人不悦,但我认为这实际上取决于您导入的 package。
根据您的问题,我收集到您明确使用::
(我个人认为这是一种很好的做法),然后您甚至不需要更改NAMESPACE
。 对于大多数情况来说,这很好,尽管可能有非常特殊的情况通常需要单独考虑。 这些特殊情况,至少在我的经验中,通常与 S4 generics 有关。
Take for instance the base::rowSums
function: it is not a generic function in base
, but if the Matrix
package is attached, rowSums
is "transformed" into an S4 generic, but the generic is not in the base package. 为什么会出现这种情况超出了这个答案的 scope (有关更多信息,请参阅?Methods_for_Nongenerics
),但这意味着如果您的 package 使用符号base::rowSums
,它不会调度到来自Matrix
的方法。 支持这两种情况的唯一方法(即当用户不使用Matrix
时以及何时使用时)是使用没有base::
的rowSums
。
现在,关于中缀运算符,如果你想使用::
,你需要类似base::`%in%`("a", c("a", "b"))
的东西,这基本上需要使用它作为 function 并丢失了中缀语法,这是您可能不想要的。
因此,除非您有非常具体的理由避免使用其中一种,否则请使用您喜欢的任何符号。 我个人会尽可能地坚持::
,但永远不会将它用于中缀运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.