R语言报错处理:The following object is masked from ‘package:stats’:
引自 https://stackoverflow.com/questions/39137110/what-does-the-following-object-is-masked-from-packagexxx-mean/39137111#39137111
原文出处, 基本上是汉化了一下, 侵删
问题
在载入程序包igraph时, 遇到报错:
> library(igraph)The following objects are masked from ' package:stats': decompose, spe...
然后找了半天没有中文的解释, 辗转翻到一份英文的回答, 写的详实并且延伸了很多, 没辙只好啃完, 然后践行下"拿来主义", 也是便于以后自己参考.
原因
R的functions调用
当使用一个function的时候, R会根据名称按照一定的顺序去查找, 具体的顺序可通过search()进行查看.
> search() #查看载入的程序包[1] ".GlobalEnv" "package:igraph" "tools:rstudio" [4] "package:stats" "package:graphics" "package:grDevices"[7] "package:utils" "package:datasets" "package:methods" [10] "Autoloads" "package:base"
2个同名函数的处理
由于上面查找顺序的存在, 当有两个同名函数的时候, 在查找到第一个的时候查找停止并进行调用, 因此, 有了如下警告
The following objects are masked from ' package:某某':
对于当前的状态,igraph出现在stats之前, 所以两者中相同名称的 decompose, spe...等functions, stats中的会被覆盖(masked)掉, 调用decompose, 可见 '<environment: namespace:igraph>'(如下)
> decomposefunction (graph, mod...) { if (!is_igraph(graph)) { ... as.numeric(min.vertices))}<bytecode: 0x0000024d59323fe0><environment: namespace:igraph>
如何调用覆盖掉的函数
对于被覆盖的函数调用, 可以采用程序包名+函数名的方式进行; 具体的方法为使用两个冒号进行连接(::), 具体如下
> stats::decomposefunction (x, typ...) { type <- match.arg(type) ... class = "decomposed.ts")}<bytecode: 0x0000024d5931c600><environment: namespace:stats>
警告关闭
(原文的延伸, 然后一并看了转过来. 自己缺少这种打破沙锅问到底的意识, 需要改进)
方法一
对于某些强迫症并且了解是哪些函数有冲突的人而言, 可以通过修改warn.conflicts参数关掉这些警告(PS:library竟然是有许多参数的...), 如下:
library(程序包, warn.conflicts=F)
方法二
另一种替代方法
suppressPackageStartupMessages(library(程序包))
R启动过程影响
如果修改了R的启动的设置, 可能会影响程序包间的覆盖情况, 可以使用?Startup
查看.
列出所有存在覆盖的函数
其中涉及管道操作, 本人能力有限, 此处为搬运
#首先获取所有的程序包library(dplyr)envs <- search() %>% setNames(., .)#获取每个程序包中的函数和变量等信息fns <- lapply(envs, ls)#转化为data.frame方便处理(涉及之前导入的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)
这样一顿操作,然后就可以获得名称重复的函数
其他
通过library(conflicted)
, 可以在使用名称重复的函数时获得提醒(代价是不分先后都要用::
来表明要使用的哪一个函数)