当加载两个包含同名函数的包时,会发生名称冲突。因此,可以在两个地方避免名称冲突:
截至撰写本文时(2017 年 8 月 23 日),CRAN 上有数量惊人的 11272 个软件包(最新数据可以在此处找到),并且每天都会添加新软件包。
因此,创建当前唯一的函数名称可能会在将来添加其他包时导致名称冲突。
Alisaire 已经提到了为所有函数添加前缀的选项。除了stringi和之外stringr,forcats包是另一个使用前缀fct_和 的示例lvls_。
这种方法可以大大降低名称冲突的可能性。
(尽管不能保证其他包维护者不会选择相同的前缀。)
恕我直言,避免名称冲突的最终责任在于用户。
我在这里看到了有关 SO 的问题,其中加载了六个以上的软件包。或者,library(tidyverse)为了方便而调用,它正在加载 19 个其他包,dplyr而 和tidyr就足够了。
命名空间中充满许多加载的包会增加名称冲突的风险。即使只加载两个包,也可能会发生名称冲突。例如, thelubridate和data.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)
Run Code Online (Sandbox Code Playgroud)[1] 18 19 20 21
# call function from lubridate package
DT[, lubridate::second(t)]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)[1] 18.88337 19.88337 20.88337 21.88337
使用双冒号运算符还有另一个好处。它将作为代码中调用函数的包中的文档。
这是以一些额外的击键为代价的,但在几周或几年后检查、修改或调试代码时可能会节省大量时间。我见过很多关于 SO 的问题,其中 OP 没有提到该软件包。