首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“下面的对象屏蔽了'package:xxx'”是什么意思?

“下面的对象屏蔽了'package:xxx'”是什么意思?
EN

Stack Overflow用户
提问于 2016-08-25 13:11:09
回答 3查看 181.4K关注 0票数 87

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

代码语言:javascript
运行
复制
"The following object is masked from 'package:xxx'

例如,如果我先加载testthat,然后加载assertive,则会得到以下结果:

代码语言:javascript
运行
复制
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

这条消息是什么意思,我如何防止它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-25 13:11:09

该消息表示这两个包具有相同名称的函数。在本例中,testthatassertive包包含五个同名的函数。

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

R将在search路径中查找函数,并将使用它找到的第一个函数。

代码语言:javascript
运行
复制
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之后加载的,因此它出现在搜索路径的前面,因此将使用该包中的函数。

代码语言:javascript
运行
复制
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中的函数不能以通常的方式访问;也就是说,它们已被屏蔽。

如果我想使用其中一个被屏蔽的函数怎么办?

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

代码语言:javascript
运行
复制
testthat::is_true
## function () 
## {
##     function(x) expect_true(x)
## }
## <environment: namespace:testthat>

如何抑制该消息?

如果您知道函数名clash,并且不想再次看到它,那么可以通过将warn.conflicts = FALSE传递给library来禁止显示该消息。

代码语言:javascript
运行
复制
library(testthat)
library(assertive, warn.conflicts = FALSE)
# No output this time

或者,使用suppressPackageStartupMessages禁止显示消息

代码语言:javascript
运行
复制
library(testthat)
suppressPackageStartupMessages(library(assertive))
# Also no output

R's启动过程对函数掩蔽的影响

如果您更改了R的一些启动配置选项(请参阅?Startup),您可能会体验到与预期不同的功能屏蔽行为。在?Startup中,事情发生的精确顺序应该会解开大多数谜团。

例如,那里的文档说:

请注意,当获取站点和用户配置文件时,仅加载基本包,因此其他包中的对象需要通过utils::dump.frames或在显式加载相关包之后引用。

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

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

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

代码语言:javascript
运行
复制
library(dplyr)
envs <- search() %>% setNames(., .)

对于每个环境,获取导出的函数(和其他变量)。

代码语言:javascript
运行
复制
fns <- lapply(envs, ls)

将其转换为数据帧,以便与dplyr一起使用。

代码语言:javascript
运行
复制
fns_by_env <- data_frame(
  env = rep.int(names(fns), lengths(fns)),
  fn  = unlist(fns)
)

查找对象多次出现的情况。

代码语言:javascript
运行
复制
fns_by_env %>% 
  group_by(fn) %>% 
  tally() %>% 
  filter(n > 1) %>% 
  inner_join(fns_by_env)

要测试这一点,请尝试加载一些具有已知冲突的包(例如,HmiscAnnotationDbi)。

如何防止名称冲突bug?

每当您尝试使用名称不明确的变量时,conflicted包都会抛出一个错误,其中包含一条有用的错误消息。

代码语言:javascript
运行
复制
library(conflicted)
library(Hmisc)
units
## Error: units found in 2 packages. You must indicate which one you want with ::
##  * Hmisc::units
##  * base::units
票数 124
EN

Stack Overflow用户

发布于 2020-08-18 17:09:19

我也有同样的问题。我用remove.packages("Package making this confusion")避免了这一点,它起作用了。在我的例子中,我不需要第二个包,所以这不是一个很好的主意。

票数 2
EN

Stack Overflow用户

发布于 2021-06-24 11:35:06

这不是对这里提出的问题的回答,而是对R开发人员的建议和想法。请采取以下措施之一,以避免这里提出的问题的发生。

  1. 其中必须有包和函数的列表。开发人员可以查看该列表,并为其函数命名,这样它就不会与其他函数冲突。或者,alternatively
  2. R软件必须自动为那些随后添加的函数名分配一个唯一的字母数值,例如< function -相关软件包的第一个字母-数值。为了说明,假设在包“pak”中已经存在函数"fun“;如果随后由另一个包"pak1”添加相同的名称"fun“,则在安装包”pak1“时,随后添加的"fun”必须自动采用新名称"fun_1“。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39137110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档