2017-06-16 11 views
0

私はスパース行列で動作するように行列ライブラリを使用しています。時々、S4Vectorsライブラリに依存するBioconductorパッケージを使用する関数を実行する必要があります。残念ながら、Matrixの "colSums"関数はS4Vectorsの "colSums"関数と競合します。したがって、この関数を実行すると、実際には迷惑な "colSums"関数が壊れます。しかし、私はめったにこの機能を使用しないので、私は唯一のロードBioconductorパッケージときに好むだろう - 行列ライブラリをロード前に、Bioconductorパッケージをロード) 1:R - 関数(または変更パッケージの優先順位)をリロードする方法

私は、この問題に対する2つの一般的な解決策があることを知っていますそれが必要。 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はあなたの地球環境に属しているため、他のライブラリの前にあります。

編集

私はより良い解決策を見つけました。 彼らは両方のarrange機能を持っており、紛争の原因となるので、私はplyrdplyrでデモンストレーションを行います。

例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が表示されています。

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" 

は結論として、あなたはposとして多数を与えるとBioconductorライブラリをロードすることができます。つまり、BioconductorS4Vectorに、S4Vectorは矛盾の原因となっています。残念ながらrequireステートメントはBioconductorパッケージ内にあるので、直接依存パッケージの位置を制御することはできません。
回避策は、あなたがposオプションを使用して最初のS4Vectorを読み込むことで、その後、Bioconductorをロード:

library(S4Vector, pos=10) # replace 10 by an appropriate large number 
library(Bioconductor) 

その後、S4Vectorは、検索順序でMatrix後に配置されます。あなたがMatrixをリロードしたい場合

さらに別のSOLUTION

、そしてあなたも好き行うことができます。

library(dplyr) 
library(plyr) 
environment(arrange) 
# <environment: namespace:plyr> 

unloadNamespace("dplyr") 
library(dplyr) 
environment(arrange) 
# <environment: namespace:dplyr> 
+0

ありがとう!これは完璧なソリューションであり、本当にありがとうございます。 –

0

例:

library(lubridate) 

lubdridateは日付をoverides。次のオブジェクトが 'package:base'からマスクされています:日付 でも元の日付機能にはアクセスできます。

base::date() 

したがって、読み込み順序がわかりません。あなたが使用する機能を特定してください。あなたが既に知っているよう

関連する問題