该消息表示两个软件包都具有相同名称的功能。在这种特殊情况下,testthat
和assertive
程序包包含五个具有相同名称的函数。
当两个函数具有相同的名称时,将调用哪个函数?
R将在search
路径中查找功能,并使用找到的第一个功能。
search()
在这种情况下,由于assertive
是在之后加载的testthat
,因此它出现在搜索路径的前面,因此将使用该包中的功能。
is_true
<bytecode: 0x0000000004fc9f10>
<environment: namespace:assertive.base>
testthat
不能以通常的方式访问其中的功能。也就是说,它们已经被掩盖了。
如果我想使用其中一个被屏蔽的功能怎么办?
调用函数时,可以使用双冒号运算符显式提供程序包名称::
。例如:
testthat::is_true
如何隐藏该消息?
如果您知道函数名称冲突,并且不想再次看到它,可以通过传递warn.conflicts = FALSE
给来禁止显示该消息library
。
library(testthat)
library(assertive, warn.conflicts = FALSE)
或者,使用以下命令取消显示该消息suppressPackageStartupMessages
:
library(testthat)
suppressPackageStartupMessages(library(assertive))
R的启动过程对功能屏蔽的影响
如果您更改了R的某些启动配置选项(请参阅参考资料?Startup
),则可能会遇到与预期不同的功能屏蔽行为。事情发生的确切顺序?Startup
应该解决大多数谜团。
例如,那里的文档说:
请注意,在获取站点和用户配置文件的文件时,仅会加载基本软件包,因此其他软件包中的对象需要使用utils :: dump.frames进行引用,或者在显式加载相关软件包之后进行引用。
这意味着当通过第三方文件加载第三方软件包时,如果在R的启动过程完成后加载第三方软件包,则.Rprofile
可能会看到这些软件包中的函数被stats之类的默认软件包掩盖,而不是相反。
如何列出所有被屏蔽的功能?
首先,获取搜索路径上所有环境的字符向量。为了方便起见,我们将使用其自己的值命名此向量的每个元素。
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
,AnnotationDbi
)。
如何防止名称冲突错误?
conflicted
每当您尝试使用名称不明确的变量时,程序包都会引发错误并提供有用的错误消息。
library(conflicted)
library(Hmisc)
units
Hmisc::units
怎么办?我需要把它放到搜索路径的开始使用它是这样的:units(df$age)<-'y'
。有办法吗?