2011-08-01 15 views
12

雑多な機能を満載したパッケージがあります(What to do with imperfect-but-useful functions?参照)。関数は特に関連していないので、他のパッケージの束に依存します。多くの場合、別のパッケージを使用するパッケージ全体に1つの関数しか存在しません。しかし、DESCRIPTIONファイルでImports、Suggests、またはDependsを使用すると、パッケージがロードされるたびにパッケージの全リストがロードされます。Rパッケージに必要なときにのみパッケージをロード

特定の関数が使用されている場合にのみ、依存関係をロードする方法はありますか?関数内にlibrary()を呼び出すことはできますが、それはパッケージ管理システムには何も伝えておらず、ユーザはそれをインストールしていない可能性があるため、悪い習慣のようです。

答えて

15

Suggestsを使用することができます。パッケージを必要とする機能では、require()パッケージにコードを追加できます。利用できない場合は、エラーをスローします。たとえば私は、ビーガンパッケージに精通していますが、その説明

Depends: permute 
Suggests: MASS, mgcv, lattice, cluster, scatterplot3d, rgl, tcltk 

と我々が持っているパッケージをロードする上で、持っている:

R> require(vegan) 
Loading required package: vegan 
Loading required package: permute 
This is vegan 1.90-0 

sessionInfo()は、推奨パッケージのどれもまだ行われていないことを報告します装填/添付:

R> sessionInfo() 
R version 2.13.1 Patched (2011-07-29 r56550) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.utf8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.utf8  LC_COLLATE=en_GB.utf8  
[5] LC_MONETARY=C    LC_MESSAGES=en_GB.utf8 
[7] LC_PAPER=en_GB.utf8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C   
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] vegan_1.90-0 permute_0.5-0 

loaded via a namespace (and not attached): 
[1] tools_2.13.1 
+0

これはまさに私が探していたものです。ありがとう。 –

+4

+1この戦略はおそらくその他のパッケージにとっては適切な戦略です:あなたのパッケージをインストールするために 'Suggest'パッケージをインストールする必要はありません。大きな利点になることができるその他のパッケージの場合。例えば。 rglがマシンにインストールできない場合でも、ユーザーはビーガンの非rgl部分を使用することができます。この場合、rglを使用する関数のみが使用できません。 – cbeleites

+0

@cbeleitesこれは、Jari Oksanen(リードビーガン開発者)が私たちが使用する追加のパッケージに対してSuggestsを使用した理由です。 –

14

一般的に、私はパッケージ内でrequire()を使用しないようにしています。ご提案として、ネームスペース(これは難しくありません)で作業し、Importsを使用してください:そこに記載されているパッケージはロードされていません。

  • importFrom名前空間ファイルの宣言を使用して、1つの関数のみを別のパッケージからインポートすることができます。 importFrom(foo, x, y)は、パッケージfooの関数xyをインポートする必要があることを示しています。
  • コード内で二重コロン演算子を使用します。foo::barインポート関数barパッケージfooから。例えば。 plyr::ddply(...)パッケージなしddply機能にアクセスするすべての3つの場合において
  • またはエクスポートされていないオブジェクトの場合には三重コロン演算子(foo:::bar

ロードされ、パッケージは輸入に言及されるべきです。 Writing R Extensionsの関連する1.6章なども参照してください。

EDIT:@Gavinが指摘しているように、これは明らかに独自の名前空間を持つパッケージからインポートするときにのみ機能します。 R on(2.14?)の次のバージョンからは、すべてのパッケージに名前空間が必要です。

+2

+1それは、パッケージにはNAMESPACEがあると仮定します。多くはそうではありませんが、すべてがRの次のメジャーバージョンです。 –

+0

http://chat.stackoverflowも参照してください。com/transcript/message/1143070#1143070 –

+0

@Gavin Thxがそれを指摘してくれました。答えを更新しました。 –

関連する問題