该消息的意思是,这两个软件包中具有相同名称的函数。在这种情况下,testthat
和assertive
软件包包含五个相同名称的函数。
当两个函数具有相同的名称时,哪个会被调用?
R将通过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
<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引用其他包中的对象,或在显式加载相关包后引用。
这意味着,当通过像.Rprofile
这样的文件加载第三方包时,如果您在R的启动过程完成之后加载第三方包,则可能会看到来自那些默认包(如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'
。有没有相应的方法? - Adam Ryczkowskibase::units()
,就像使用其他任何软件包一样。 - Richie Cotton