R - 如何重新加载功能(或更改包优先级)

R - how to reload function (or change package priority)

我正在使用 Matrix 库处理稀疏矩阵。有时,我需要 运行 一个使用 Bioconductor 包的函数,它依赖于 S4Vectors 库。不幸的是,Matrix 中的 "colSums" 函数与 S4Vectors 中的 "colSums" 函数冲突。因此,当我 运行 这个功能时,它破坏了我的 "colSums" 功能,这真的很烦人。

我知道这个问题有两种常见的解决方案: 1) 在加载 Matrix 库之前 加载 Bioconductor 包 - 然而,我很少使用这个功能,所以我更愿意只在需要时加载 Bioconductor 包。 2) 不要调用 "colSums",而是调用 "Matrix::colSums" - 然而,这非常不方便,我需要更改我的整个代码库。

理想情况下,我只加载 Bioconductor 包,运行 我的函数,然后通过卸载 Bioconductor 包或重新加载 Matrix 包来清理我的环境。但是,我在做这些时遇到了麻烦。首先,是否可以重新加载 Matrix::colSums(以替换 S4Vectors::colSums)?其次,当我尝试卸载 S4Vectors 时,R 抱怨因为许多其他包依赖于它。

所以除了为什么 S4Vectors 有一个函数与 R 中最常用的稀疏矩阵包冲突这个明显的问题之外,我想知道这个问题的最佳解决方案是什么?简单地重新加载一个包不可能那么困难,对吧?

示例:

library(lubridate)

lubdridate 覆盖日期。弹出一条消息说:以下对象被“package:base”屏蔽:date 但是您仍然可以使用原始日期功能。

base::date()

所以你没有查看加载顺序。只需具体说明您使用的功能。

如您所知,正确的方法是编写 Matrix::colSums

一个不需要重写代码的简单解决方案是添加一行

colSums <- Matrix::colSums

在您的代码中的某处。然后这个 colSums 属于您的全局环境,因此在任何其他库之前被发现。

编辑

我找到了更好的解决方案。 我将使用 plyrdplyr 进行演示,因为它们都具有 arrange 功能并会导致冲突。

示例 1。 dplyr 稍后加载,因此获胜。

library(plyr)
library(dplyr)
environment(arrange)  
# <environment: namespace:dplyr>

示例 2。plyr 获胜

# unload libraries
unloadNamespace("plyr")
unloadNamespace("dplyr")
library(dplyr)
library(plyr)
environment(arrange)

关键是搜索顺序,可以通过search函数找到。 在下面,您可以看到 plyr 出现在 dplyr.

之前
search()
# [1] ".GlobalEnv"        "package:plyr"      "package:dplyr"     "tools:rstudio"    
# [5] "package:stats"     "package:graphics"  "package:grDevices" "package:utils"    
# [9] "package:datasets"  "package:methods"   "Autoloads"         "package:base" 

示例3.您可以指定要在搜索列表中加载库的位置; pos 参数。

unloadNamespace("plyr")
unloadNamespace("dplyr")    

library(plyr)
library(dplyr, pos=length(search()))
environment(arrange)
# <environment: namespace:plyr>

search()
# [1] ".GlobalEnv"        "package:plyr"      "tools:rstudio"     "package:stats"    
# [5] "package:graphics"  "package:grDevices" "package:utils"     "package:datasets" 
# [9] "package:methods"   "Autoloads"         "package:dplyr"     "package:base" 

总之,您可以加载 Bioconductor 库并提供一个大数字 pos。 也就是说,您说 Bioconductor 取决于 S4VectorS4Vector 是导致冲突的原因。不幸的是,您无法直接控制依赖包的位置,因为 require 语句在 Bioconductor 包中。
解决方法是先使用 pos 选项加载 S4Vector,然后加载 Bioconductor:

library(S4Vector, pos=10)  # replace 10 by an appropriate large number
library(Bioconductor)  

那么,S4Vector将被放在搜索顺序的Matrix之后。

另一种解决方案

如果你想重新加载Matrix,那么你也可以这样做:

library(dplyr)
library(plyr)
environment(arrange)
# <environment: namespace:plyr>

unloadNamespace("dplyr")
library(dplyr)
environment(arrange)
# <environment: namespace:dplyr>