"Imports"
よりも安全です"Depends"
(また、それを使用するパッケージを、を使用する他のパッケージよりも「より良い市民」にします"Depends"
)。
"Depends"
別のパッケージからの機能はメインサーチパス(によって返される環境、すなわちリストに他のパッケージを取り付けることによって利用可能であることを確実にするディレクティブ試みsearch()
)。ただし、後でロードされる別のパッケージが同じ名前の関数を検索パスの前に配置した場合、この戦略は妨げられる可能性があります。Chambers(SoDA内)は"gam"
、gam
およびmgcv
パッケージの両方にある関数の例を使用します。他の2つのパッケージが読み込まれた場合、1つはに依存しgam
、もう1つはに依存しmgcv
ます。への呼び出しによって検出される関数はgam()
、それら2つのパッケージが添付された順序によって異なります。良くない。
"Imports"
ディレクティブは、その機能に配置される任意の支持パッケージに使用されるべきである<imports:packageName>
(直後検索し<namespace:packageName>
、代わりに通常の検索パス上)。上記の例のいずれかのパッケージで"Imports"
メカニズム(ファイル内のディレクティブimport
またはimportFrom
ディレクティブも必要)を使用した場合NAMESPACE
、問題は2つの点で改善されます。(1)パッケージ自体が、どのmgcv
関数を使用するかを制御します。(2)インポートされたオブジェクトからメイン検索パスを離しておくことにより、他のmgcv
関数の他のパッケージの依存関係を壊すことさえありません。
これが、名前空間の使用が非常に有効な理由であり、CRANによって強制されるようになった理由であり、(特に)を使用する方"Imports"
がを使用するよりも安全な理由"Depends"
です。
重要な警告を追加するために編集:
上記のアドバイスには、残念ながら一般的な例外が1つあります。パッケージが、別のパッケージにA
あるパッケージに依存している場合、パッケージはディレクティブを使用して添付する必要があります。"Depends"
B
A
"Depends
これは、パッケージ内の関数がA
、パッケージB
とその関数がsearch()
パスに接続されることを想定して記述されているためです。
"Depends"
ディレクティブは、ロードしたパッケージを添付しますA
、でポイントパッケージA
自身の"Depends"
原因パッケージは、連鎖反応では、ディレクティブの意志をB
同様にロードされ、装着されます。パッケージ内A
の関数はB
、依存するパッケージ内の関数を見つけることができます。
"Imports"
ディレクティブは、ロードされますが、いないパッケージを添付A
してますどちらも負荷もパッケージを添付しませんB
。("Imports"
結局のところ、パッケージ作成者は名前空間メカニズムを使用しており、そのパッケージA
はアクセスが必要な"Imports"
すべての関数を指すために使用されていることを想定していますB
。)パッケージA
内の関数に依存するパッケージ内の関数への関数による呼び出しB
は結果として失敗します。
唯一の2つのソリューションは、次のいずれかです。
- ディレクティブ
A
を使用してパッケージにパッケージを添付させます"Depends"
。
- 長期的には、パッケージのメンテナに連絡し、
A
名前空間を構築するためのより慎重な作業を依頼する(この関連する回答の Martin Morganの言葉で)。