我正在使用矩阵库来处理稀疏矩阵。有时,我需要运行一个使用 Bioconductor 包的函数,该函数依赖于 S4Vectors 库。不幸的是,Matrix 中的 "colSums" 函数与 S4Vectors 中的 "colSums" 函数冲突。因此,当我运行这个函数时,它会破坏我的"colSums"函数,这真的很烦人。
我知道这个问题有两种常见的解决方案: 1) 在加载 Matrix 库之前加载 Bioconductor 包 - 但是,我很少使用此功能,所以我宁愿只在需要时加载 Bioconductor 包。 2)不要调用"colSums",而是调用"Matrix::colSums" - 但是,这非常不方便,我需要更改整个代码库。
理想情况下,我只需加载 Bioconductor 包,运行我的函数,然后通过卸载 Bioconductor 包或重新加载 Matrix 包来清理我的环境。但是,我在做这些事情时遇到了麻烦。首先,是否可以重新加载 Matrix::colSums(以便它替换 S4Vectors::colSums)?其次,当我尝试卸载 S4Vector 时,R 抱怨,因为许多其他软件包都依赖于它。
因此,除了为什么 S4Vectors 具有与 R 中最常用的稀疏矩阵包冲突的明显问题之外,我想知道这个问题的最佳解决方案是什么?简单地重新加载一个包裹不可能那么困难,对吧?
正如您已经知道的,正确的方法是编写Matrix::colSums
。
不需要重写代码的简单解决方案是添加一行
colSums <- Matrix::colSums
在代码中的某个位置。 那么这个colSums
属于你的全局环境,因此在任何其他库之前找到。
编辑
我找到了更好的解决方案。 我将plyr
和dplyr
进行演示,因为它们都具有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
取决于S4Vector
,S4Vector
是引起冲突的那个。 遗憾的是,您无法直接控制依赖包的位置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>
示例:
library(lubridate)
润滑剂覆盖日期。弹出一条消息,指出:以下对象从"package:base"屏蔽:日期 但是您仍然可以使用原始日期功能。
base::date()
所以你没有看加载顺序。只需具体说明您使用的功能即可。