"Imports"
は、"Depends"
よりも安全です("Depends"
を使用する他のパッケージに関しては、より良い市民を使ってパッケージを作成します)。
"Depends"
ディレクティブは、別のパッケージをメイン検索パス(つまり、search()
によって返される環境のリスト)に追加することによって、別のパッケージからの関数が確実に使用できるようにしようとします。しかし、後で読み込まれた別のパッケージが同じ名前の関数を検索パスの前に置くと、この戦略は阻止されます。 Chambers()は、とmgcv
パッケージの両方にある関数"gam"
の例を使用しています。他の2つのパッケージがロードされている場合、そのうちの1つはgam
に、もう1つはmgcv
に応じて、gam()
の呼び出しで見つかった関数は、それらの2つのパッケージが接続された順序に依存します。良くない。
"Imports"
ディレクティブは、通常の検索パスではなく、<imports:packageName>
(<namespace:packageName>
の直後に検索)にインポートされたパッケージを置きます。上の例のいずれかのパッケージで"Imports"
メカニズムを使用した場合、問題は2つの方法で改善されます。 (1)パッケージ自体が、mgcv
機能が使用されているかどうかを制御します。 (2)メインの検索パスをインポートされたオブジェクトから除外することによって、他のパッケージの他のパッケージへの依存性を破損させることさえありません。mgcv
これは、名前空間を使用することが、CRANによって現在強制されている理由、特に"Imports"
が"Depends"
を使用するよりも安全である理由を示しています。
重要な注意点を追加するように編集:
上記のアドバイスに残念ながら一般的な例外があります:あなたのパッケージは、パッケージに依存している場合、別のパッケージB
上A
それ自体"Depends"
、あなたパッケージにA
に"Depends
ディレクティブを付ける必要があります。
パッケージA
で機能がパッケージB
、その機能はsearch()
パスに取り付けられることを期待して書かれていたからです。
"Depends"
ディレクティブはロードし、ポイントパッケージA
自身"Depends"
ディレクティブは、連鎖反応で原因パッケージB
が同様にロードされ、添付するするときのパッケージA
を、添付します。パッケージA
の関数は、それに依存するパッケージB
の関数を見つけることができます。
"Imports"
ディレクティブがロードされますが、はないは、パッケージA
を添付し、負荷もどちらもパッケージB
を添付します。 ("Imports"
)結局のところ、パッケージ作成者は名前空間メカニズムを使用しており、そのパッケージA
は"Imports"
を使用して、アクセスが必要なB
の任意の関数を指しています)。A
のどの関数その結果、パッケージB
の関数が失敗します。
- は、あなたのパッケージを持って
"Depends"
ディレクティブを使用してパッケージA
を添付: 2つのだけのソリューション
のいずれかになっています。
- 長期的には、
A
というパッケージのメンテナーに連絡して、彼らの名前空間を構築するためのより慎重な作業を依頼してください(this related answerのMartin Morganの言葉で)。
あなたのブログの記事が戻って、すべてのパッケージの構造について教えてくれました[*モジュール*](https://github.com/klmr/modules)。ありがとう! –