2017-06-16 121 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() 

所以你沒有看看加載順序。只需具體說明您使用的是哪種功能。