R包的函数命名

时间:2017-08-22 15:14:29

标签: r function duplicates packages names

我正在编写R包,并且非常希望避免使用其他包中的函数名。例如,我打算调用一个函数' annotate',但这已经在NLP包中使用了。显然最好避免明显的名称选择,但有没有系统的方法来搜索CRAN发布的功能名称的详尽列表,以避免重复?我很欣赏这对于CRAN共享软件包非常重要,但是在本地共享时也可能是相关的,以防万一与另一个加载的软件包发生冲突。

1 个答案:

答案 0 :(得分:4)

当加载包含具有相同名称的函数的两个包时,会发生名称冲突。因此,可以在两个地方避免名称冲突:

  • 在包中定义函数名称时
  • 从包中调用函数时

创建具有唯一名称的函数

在撰写本文时(2017年8月23日),CRAN上提供了令人难以置信的11272个软件包(最新数据可以找到here),新软件包正在added every day

因此,当添加其他包时,创建唯一今天的功能名称可能会在将来导致名称冲突

Alistaire already has mentioned选项为您的所有功能添加前缀。除stringistringr外,forcats个包是另一个使用前缀fct_lvls_的示例。

这种方法可能会大大降低名称冲突的可能性。

(虽然不能保证其他软件包维护者不会选择相同的前缀。)

使用双冒号运算符

明确调用函数 恕我直言,避免姓名冲突的最终责任是用户。

我已经在这里看到了有关装载了六个以上包裹的问题。或者,为方便起见,调用了library(tidyverse),其中加载了19个其他包,其中dplyrtidyr已足够。

使用许多加载的包破坏命名空间会增加名称冲突的风险。即使只加载了两个包,也可能发生名称冲突。例如,lubridatedata.table包都定义了

hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

调用哪个函数取决于软件包的加载顺序。 (您可以使用conflicts()在搜索路径上的两个或多个位置查找具有相同名称的对象。)

为了避免歧义和意外结果,我建议尽可能少地加载包并使用双冒号运算符?"::"从包调用函数而不事先加载包,例如,

library(data.table)
DT <- data.table(t = lubridate::now() + 0:3)
# call function from loaded package data.table
DT[, second(t)] 
[1] 18 19 20 21
# call function from lubridate package
DT[, lubridate::second(t)]
[1] 18.88337 19.88337 20.88337 21.88337

使用双冒号运算符还有另一个好处。它将作为代码中的文档,从中调用函数包。

这是以一些额外的击键为代价的,但是在几周或几年后检查,修改或调试代码时可能会节省大量时间。我已经看到很多关于OP的问题,OP没有提到这个包。