当我加载一个包时,我收到一条消息,指出:

"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

此消息是什么意思,我该如何防止?

最佳答案

该消息意味着两个包都具有相同名称的函数。在这种特殊情况下,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 的启动程序对函数屏蔽的影响

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

例如,那里的文档说:



这意味着当通过 .Rprofile 之类的文件加载第 3 方包时,您可能会看到那些包中的函数被默认包中的函数屏蔽,如 stats ,而不是相反,如果您在 R 后完成了第 3 方的启动程序包加载。

如何列出所有被屏蔽的函数?

首先,获取搜索路径上所有环境的字符向量。为方便起见,我们将用它自己的值命名这个向量的每个元素。
library(dplyr)
envs <- search() %>% setNames(., .)

对于每个环境,获取导出的函数(和其他变量)。
fns <- lapply(envs, ls)

将其转换为数据框,以便与 d​​plyr 一起使用。
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
## Error: units found in 2 packages. You must indicate which one you want with ::
##  * Hmisc::units
##  * base::units

关于r - "The following object is masked from ' 包 :xxx'"mean? 有什么用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39137110/

10-13 05:03