该消息意味着这两个包具有相同名称的函数。在这种特殊情况下,testthat
and assertive
包包含五个同名的函数。
当两个函数同名时,哪个函数会被调用?
R 将查看search http://www.rdocumentation.org/packages/base/topics/search查找函数的路径,并将使用它找到的第一个函数。
search()
## [1] ".GlobalEnv" "package:assertive" "package:testthat"
## [4] "tools:rstudio" "package:stats" "package:graphics"
## [7] "package:grDevices" "package:utils" "package:datasets"
## [10] "package:methods" "Autoloads" "package:base"
在这种情况下,由于assertive
被加载后testthat
,它出现在搜索路径的前面,因此将使用该包中的函数。
is_true
## function (x, .xname = get_name_in_parent(x))
## {
## x <- coerce_to(x, "logical", .xname)
## call_and_name(function(x) {
## ok <- x & !is.na(x)
## set_cause(ok, ifelse(is.na(x), "missing", "false"))
## }, x)
## }
<bytecode: 0x0000000004fc9f10>
<environment: namespace:assertive.base>
中的函数testthat
无法以通常方式访问;也就是说,他们已经masked.
如果我想使用屏蔽函数之一怎么办?
您可以在调用函数时使用双冒号运算符显式提供包名称,:: http://www.rdocumentation.org/packages/base/topics/ns-dblcolon。例如:
testthat::is_true
## function ()
## {
## function(x) expect_true(x)
## }
## <environment: namespace:testthat>
如何抑制该消息?
如果您知道函数名称冲突,并且不想再次看到它,可以通过传递来抑制该消息warn.conflicts = FALSE
to library http://www.rdocumentation.org/packages/base/topics/library.
library(testthat)
library(assertive, warn.conflicts = FALSE)
# No output this time
或者,使用以下命令抑制消息suppressPackageStartupMessages http://www.rdocumentation.org/packages/base/topics/message:
library(testthat)
suppressPackageStartupMessages(library(assertive))
# Also no output
R 的启动过程对函数屏蔽的影响
如果您更改了 R 的一些启动配置选项(请参阅?Startup
)您可能会遇到与您预期不同的功能屏蔽行为。事情发生的精确顺序如下所示?Startup
应该能解开大部分谜团。
例如,那里的文档说:
请注意,当站点和用户配置文件仅来源于
基础包已加载,因此其他包中的对象需要
由例如提及utils::dump.frames 或显式加载后
涉及的包裹。
这意味着当通过类似文件加载第 3 方包时.Rprofile
您可能会看到这些包中的函数被默认包中的函数掩盖,例如stats,而不是相反,如果您在 R 的启动过程完成后加载了第 3 方包。
如何列出所有屏蔽函数?
首先,获取搜索路径上所有环境的特征向量。为了方便起见,我们将用其自己的值来命名该向量的每个元素。
library(dplyr)
envs <- search() %>% setNames(., .)
对于每个环境,获取导出的函数(和其他变量)。
fns <- lapply(envs, ls)
将其转换为数据框,以便于与 dplyr 一起使用。
fns_by_env <- data_frame(
env = rep.int(names(fns), lengths(fns)),
fn = unlist(fns)
)
查找该对象多次出现的情况。
fns_by_env %>%
group_by(fn) %>%
tally() %>%
filter(n > 1) %>%
inner_join(fns_by_env)
要测试这一点,请尝试加载一些具有已知冲突的包(例如,Hmisc https://cran.r-project.org/web/packages/Hmisc, AnnotationDbi https://www.bioconductor.org/packages/release/bioc/html/AnnotationDbi.html).
如何防止名称冲突错误?
The conflicted
每当您尝试使用名称不明确的变量时,程序包都会抛出错误并提供有用的错误消息。
library(conflicted)
library(Hmisc)
units
## Error: units found in 2 packages. You must indicate which one you want with ::
## * Hmisc::units
## * base::units