R包的函数命名

Hea*_*son 5 packages r function names duplicates

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

Uwe*_*Uwe 4

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

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

创建具有唯一名称的函数

截至撰写本文时(2017 年 8 月 23 日),CRAN 上有数量惊人的 11272 个软件包(最新数据可以在此处找到),并且每天都会添加新软件包。

因此,创建当前唯一的函数名称可能会在将来添加其他包时导致名称冲突。

Alisaire 已经提到了为所有函数添加前缀的选项。除了stringi和之外stringrforcats包是另一个使用前缀fct_和 的示例lvls_

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

(尽管不能保证其他包维护者不会选择相同的前缀。)

使用双冒号运算符明确调用函数

恕我直言,避免名称冲突的最终责任在于用户。

我在这里看到了有关 SO 的问题,其中加载了六个以上的软件包。或者,library(tidyverse)为了方便而调用,它正在加载 19 个其他包,dplyr而 和tidyr就足够了。

命名空间中充满许多加载的包会增加名称冲突的风险。即使只加载两个包,也可能会发生名称冲突。例如, thelubridatedata.tablepackage 都定义了

hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year
Run Code Online (Sandbox Code Playgroud)

调用哪个函数将取决于包的加载顺序。(您可以用来conflicts()查找在搜索路径上两个或多个位置存在的同名对象。)

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

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

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

这是以一些额外的击键为代价的,但在几周或几年后检查、修改或调试代码时可能会节省大量时间。我见过很多关于 SO 的问题,其中 OP 没有提到该软件包。