2017-06-16 77 views
0

我正在使用Matrix库来处理稀疏矩阵。偶尔,我需要运行一个使用Bioconductor软件包的函数,它依赖于S4Vectors库。不幸的是,Matrix中的“colSums”函数与S4Vectors中的“colSums”函数冲突。因此,当我运行这个函数时,它会打破我的“colSums”函数,这真的很烦人。R - 如何重新加载函数(或更改包优先级)

我知道有这个问题,有两种常用的解决方案: 1)根据Bioconductor的包加载矩阵库 - 但是,我很少使用这个功能,所以我宁愿只加载Bioconductor的包时我需要它。 2)不是调用“colSums”,而是调用“Matrix :: colSums” - 然而,这是非常不方便的,我需要改变我的整个代码库。

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

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

+0

更新:最好的办法是建议由哥打森,使用“unloadNamespace”功能第一在重新加载之前卸载Matrix软件包。 –

回答

1

正如您所知,正确的方法是编写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包内,因此您无法直接控制依赖包的位置。
一种解决方法是,您加载S4Vector先用pos选项,然后加载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> 
+0

谢谢!这是一个完美的解决方案,我非常感谢你的帮助。 –

0

实施例:

library(lubridate) 

lubdridate日期会取代。弹出一条消息说:下面的对象从'package:base'被屏蔽:date 但是你仍然可以到达原始的日期函数。

base::date() 

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