2011-12-26 4 views
122

を依存「Writing R Extensions」マニュアルは輸入を使用するときに、次の指針を提供するかによって異なります。インポートを使用する際のより良い説明が/

The general rules are

  • Packages whose namespace only is needed to load the package using library(pkgname) must be listed in the ‘Imports’ field and not in the ‘Depends’ field.
  • Packages that need to be attached to successfully load the package using library(pkgname) must be listed in the ‘Depends’ field, only.

誰かがこの上もう少し明快さを提供することはできますか?パッケージに名前空間をロードする必要があるときと、パッケージを必要とするときを知るにはどうすればよいですか?両方の例は何ですか?私は、典型的なパッケージは、時には他のパッケージの関数を呼び出す関数の集まりだと思います(作業の一部はすでにコード化されています)。上記のシナリオ1または2ですか?

編集

私は、この特定のトピック( 'DependsとVインポート' を検索)上のセクションでblog postを書きました。ビジュアルにより、理解しやすくなります。

+0

あなたのブログの記事が戻って、すべてのパッケージの構造について教えてくれました[*モジュール*](https://github.com/klmr/modules)。ありがとう! –

答えて

117

"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"を使用するよりも安全である理由を示しています。


重要な注意点を追加するように編集:

上記のアドバイスに残念ながら一般的な例外があります:あなたのパッケージは、パッケージに依存している場合、別のパッケージBAそれ自体"Depends"、あなたパッケージにA"Dependsディレクティブを付ける必要があります。

パッケージA機能がパッケージB、その機能はsearch()パスに取り付けられることを期待して書かれていたからです。

"Depends"ディレクティブはロードし、ポイントパッケージA自身"Depends"ディレクティブは、連鎖反応で原因パッケージBが同様にロードされ、添付するするときのパッケージAを、添付します。パッケージAの関数は、それに依存するパッケージBの関数を見つけることができます。

"Imports"ディレクティブがロードされますが、はないは、パッケージAを添付し、負荷どちらもパッケージBを添付します。 ("Imports")結局のところ、パッケージ作成者は名前空間メカニズムを使用しており、そのパッケージA"Imports"を使用して、アクセスが必要なBの任意の関数を指しています)。Aのどの関数その結果、パッケージBの関数が失敗します。

  1. は、あなたのパッケージを持って"Depends"ディレクティブを使用してパッケージAを添付:

    2つのだけのソリューション

    のいずれかになっています。
  2. 長期的には、Aというパッケージのメンテナーに連絡して、彼らの名前空間を構築するためのより慎重な作業を依頼してください(this related answerのMartin Morganの言葉で)。
+0

ああ!ありがとうジョシュ、あなたは今日のロールです。 – SFun28

+0

まあ、彼らはおもしろい質問でした。私はちょうど最近自分のプロジェクトの一部をパッケージ化し始めたので、私はあなたと同じ思考の道を歩んできました;) –

+1

最近、最近、これらの問題に深刻な懸念を抱いていますが、これらは微妙で、しばしばコミュニケーションが困難な概念です。ここで別の説明を参照します:http:// stackoverflow。com/questions/7880355/upcoming-namespace-depends-imports-changes-for 2-14-0-some-definitions-use-pl –

13

SfDAのチェンバーは、このパッケージが '名前空間'メカニズムを使用し、すべてのパッケージにそれらが必要なので、 'Imports'を使用すると言います。過去のパッケージでは、実際に名前空間を持たずに読み込まれている可能性があり、その場合、Dependsを使用する必要がありました。

+2

パッケージが "imports"で指定されていて、パッケージ内の関数を使用する場合、自分の関数はライブラリ(...)を呼び出す必要がありますか?また、SfDAとは何ですか?リンク? – SFun28

+2

*データ解析用ソフトウェア*:http://www.springer.com/statistics/computanional+statistics/book/978-0-387-75935-7 ...あなたの質問については、私は答えを知らないオフフックですが、最小限のテストパッケージを簡単にハックアップし、経験的に答えを見つけることができます... –

+1

SfDA == "ソフトウェアのデータ解析"。 [65](http://www.r-project.org/doc/bib/R-books.html)を参照してください。パッケージで別のパッケージが指定されている場合は、コンソールでlibrary()またはrequire()を使用すると、依存(encies)およびインポート(ations)の読み込みについてのメッセージが表示されます。はい、利用可能になるはずです。 –

23

ハドレーウィッカムは、簡単な説明(http://r-pkgs.had.co.nz/namespace.html)を与える:私は計画を始めたとき

Listing a package in either Depends or Imports ensures that it’s installed when needed. The main difference is that where Imports just loads the package, Depends attaches it. There are no other differences. [...]

Unless there is a good reason otherwise, you should always list packages in Imports not Depends . That’s because a good package is self-contained, and minimises changes to the global environment (including the search path). The only exception is if your package is designed to be used in conjunction with another package. For example, the analogue package builds on top of vegan. It’s not useful without vegan, so it has vegan in Depends instead of Imports . Similarly, ggplot2 should really Depend on scales, rather than Importing it.

関連する問題