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



我正在使用矩阵库来处理稀疏矩阵。有时,我需要运行一个使用 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属于你的全局环境,因此在任何其他库之前找到。

编辑

我找到了更好的解决方案。 我将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函数找到它。 下面,您可以看到plyrdplyr之前出现。

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> 

示例:

library(lubridate)

润滑剂覆盖日期。弹出一条消息,指出:以下对象从"package:base"屏蔽:日期 但是您仍然可以使用原始日期功能。

base::date()

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

相关内容

  • 没有找到相关文章

最新更新