什么“以下对象被掩盖'package:xxx'”是什么意思?

时间:2016-08-25 05:11:09

标签: r r-faq

当我加载包时,我收到一条消息,说明:

"The following object is masked from 'package:xxx'

例如,如果我加载testthat然后加载assertive,我会收到以下信息:

library(testthat)
library(assertive)  
## Attaching package: ‘assertive’
## 
## The following objects are masked from ‘package:testthat’:
## 
##     has_names, is_false, is_less_than, is_null, is_true

此消息的含义是什么,我该如何预防?

3 个答案:

答案 0 :(得分:72)

该消息表示两个包都具有相同名称的功能。在这种特殊情况下,testthatassertive包中包含五个具有相同名称的函数。

当两个函数具有相同的名称时,会调用哪个函数?

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
## 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中的功能无法以通常的方式访问;也就是说,他们已经蒙面

如果我想使用其中一个蒙版函数怎么办?

使用双冒号运算符::调用函数时,可以显式提供包名。例如:

testthat::is_true
## function () 
## {
##     function(x) expect_true(x)
## }
## <environment: namespace:testthat>

如何禁止消息?

如果您知道功能名称冲突,并且不想再次查看,则可以通过将warn.conflicts = FALSE传递给library来取消删除邮件。

library(testthat)
library(assertive, warn.conflicts = FALSE)
# No output this time

或者,使用suppressPackageStartupMessages

取消消息
library(testthat)
suppressPackageStartupMessages(library(assertive))
# Also no output

R&#39启动程序对功能屏蔽的影响

如果您更改了某些R的启动配置选项(请参阅?Startup),您可能会遇到与预期不同的功能屏蔽行为。 ?Startup中列出的事情的确切顺序应解决大多数谜团。

例如,那里的文档说:

  

请注意,当网站和用户个人资料文件仅来源时   基础包已加载,因此其他包中的对象需要   例如, utils :: dump.frames或显式加载之后   包裹有关。

这意味着当通过.Rprofile等文件加载第三方软件包时,您可能会看到这些软件包中的功能被默认软件包中的功能掩盖,例如 stats ,而不是相反,如果您在R的启动程序完成后加载第三方软件包。

如何列出所有蒙版函数?

首先,获取搜索路径上所有环境的字符向量。为方便起见,我们将使用自己的值为此向量的每个元素命名。

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)

要对此进行测试,请尝试加载一些已知冲突的软件包(例如HmiscAnnotationDbi)。

如何防止名称冲突错误?

每当您尝试使用名称不明确的变量时,conflicted包都会引发错误并显示有用的错误消息。

library(conflicted)
library(Hmisc)
units
## Error: units found in 2 packages. You must indicate which one you want with ::
##  * Hmisc::units
##  * base::units

答案 1 :(得分:0)

我有同样的问题。我用remove.packages("Package making this confusion")避免了它,并且可以正常工作。就我而言,我不需要第二个软件包,所以这不是一个好主意。

答案 2 :(得分:0)

这不是对此处提出的问题的回答,而是对 R 开发人员的建议和想法。请采取以下任何一种措施,以避免出现此处提出的问题。

  1. 其中必须有包和函数的列表。开发人员可以查看列表并为其功能命名,以免与其他功能发生冲突。 或者,或者
  2. R 软件必须自动为那些函数名称分配一个唯一的字母数字值,例如