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), 可以在使用名称重复的函数时获得提醒(代价是不分先后都要用::来表明要使用的哪一个函数)

(0)

相关推荐