我正在编写一个 R 包,并且非常希望避免使用在其他包中找到的函数名称。例如,我计划调用一个函数 'annotate',但这已经在 NLP 包中使用了。显然最好避免明显的名称选择,但是是否有一种系统的方法来搜索 CRAN 发布的函数名称的详尽列表以避免重复?我明白这对于 CRAN 共享包来说很重要,但在本地共享时它也很重要,以防与另一个加载的包发生冲突。
最佳答案
当加载包含同名函数的两个包时,会发生名称冲突。因此,可以在两个地方避免名称冲突:
创建具有唯一名称的函数
在撰写本文时(2017 年 8 月 23 日),CRAN 上提供了数量惊人的 11272 个包(最新数据可在 here 中找到),新包正在 added every day .
因此,创建今天唯一的函数名称可能会在将来添加其他包时导致名称冲突。
Alistaire already has mentioned为所有函数添加前缀的选项。除了
stringi
和 stringr
, forcats
包是另一个使用前缀 fct_
的例子。和 lvls_
.这种方法可以大大降低名称冲突的可能性。
(虽然不能保证没有其他包维护者可能会选择相同的前缀。)
使用双冒号运算符明确调用函数
恕我直言,避免名称冲突的最终责任是用户的。
我在这里看到了关于 SO 的问题,其中加载了六个以上的包。或者,
library(tidyverse)
被调用是为了方便,它正在加载 19 个其他包,其中 dplyr
和 tidyr
就足够了。大量加载的包使命名空间困惑会增加名称冲突的风险。即使只加载了两个包,也可能会发生名称冲突。例如,
lubridate
和 data.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 没有提到包的问题。
关于r - R 包的函数命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45821410/