我正在使用矩阵库来处理稀疏矩阵。偶尔,我需要运行一个使用生物导体包的函数,它依赖于S4Vectors库。不幸的是,矩阵中的"colSums“函数与S4Vectors中的"colSums”函数冲突。因此,当我运行这个函数时,它破坏了我的"colSums“函数,这真的很烦人。
对于这个问题,我知道有两种常见的解决方案: 1)在加载矩阵库之前加载生物导体包--然而,我很少使用这个函数,所以我倾向于只在需要的时候加载生物导体包。2)而不是调用"colSums",而是调用"Matrix::colSums“--然而,这是非常不方便的,我需要更改我的整个代码库。
理想情况下,我只是加载生物导体包,运行我的功能,然后通过卸载生物导体包或重新加载矩阵包来清理我的环境。然而,我在做这些方面有困难。首先,是否有可能重新加载矩阵::colSums(以便替换S4Vectors::colSums)?其次,当我试图卸载S4Vectors时,R会抱怨,因为很多其他包都依赖它。
因此,除了S4Vectors为什么有一个与R中最常用的稀疏矩阵包冲突的函数这一显而易见的问题之外,我想知道这个问题的最佳解决方案是什么?简单地重新装载一个包不可能那么困难,对吧?
发布于 2017-06-16 04:50:25
正如您已经知道的,正确的方法是编写Matrix::colSums
。
一个不需要重写代码的简单解决方案是添加一行
colSums <- Matrix::colSums
在你的密码里。然后,这个colSums
属于您的全局环境,因此在任何其他库之前都可以找到。
编辑
我找到了更好的解决办法。我将用plyr
和dplyr
演示,因为它们都有arrange
函数,并且会引起冲突。
Example1。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
包中。
解决方法是,首先使用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>
发布于 2017-06-16 04:35:10
示例:
library(lubridate)
卢布多日弹出一条消息说:下面的对象被隐藏在‘package:base’:date中,但是您仍然可以到达原始的date函数。
base::date()
所以你不需要看装货顺序。只需具体说明你在哪种功能中使用。
https://stackoverflow.com/questions/44578920
复制