46

package に依存するパッケージを開発していますfoo。私のパッケージ コードには、 からエクスポートされた関数への呼び出しがありますfoo。パッケージ名を宣言とともに含め、ファイルの行の下にもNAMESPACE含めました。ただし、実行時に次の警告が表示されます。import(foo)Imports:DESCRIPTIONR CMD check

r 'library' or 'require' calls not declared from: 'foo'

私は何が欠けていますか?

.onLoad を使用して依存するパッケージをロードする にも同様の質問がありますが、この特定の警告については議論されていないようです。

4

2 に答える 2

47

最も可能性の高い候補は、関数にrequire(<pkg>)またはへの不要な呼び出しが含まれていることlibrary(<pkg>)です。このエラー メッセージは少し誤解を招きます。コード内にrequireまたはlibrary呼び出しを配置し​​たが、ファイル内でそれらの呼び出しを実際に (適切に) 宣言していないことを示していDESCRIPTIONます。

これらのパッケージのコードを自分のパッケージで使用するつもりなら、これらのlibrary/require呼び出しは必要ありません。むしろ、それらのパッケージを使用していること (およびそれらをどのように使用しているか) をファイルで適切に宣言する必要がありDESCRIPTIONます。

ほとんどの場合、パッケージを「インポート」して、エクスポートされた関数/シンボルの一部またはすべてをパッケージで使用できるようにする必要があります。Imports:そのようなパッケージをファイルのフィールドに追加できDESCRIPTIONます-たとえば

Imports: <pkg>

同様に、ファイルに次のように記述して、そのパッケージからエクスポートされたすべてのシンボルを使用することを宣言します。NAMESPACE

import(<pkg>)

これにより、 の名前空間内のすべての関数が自動的に使用可能になるため、コード内のどこでもそのパッケージを使用<pkg>する必要はありません。require

パッケージのコンテキスト内での主な用途は、require条件付きでのみ使用できるようにする機能です。たとえば、 を必要とする非常に特殊なプロット メソッドを処理する関数を作成するfoofooします。したがって、条件付きで package に依存するコードを含めたい場合はfoo、次のような形式で記述できます。

if (require("foo")) {
  #do stuff
}

そして、ではなくアンダーに含めることfooができDESCRIPTIONます。もう 1 つの例は、ビネットの作成に使用されるパッケージですが、パッケージのユーザーが必要とすることはありません。Suggests:Imports:

要約すると、パッケージの名前空間にエクスポートされた関数を使用するためだけにパッケージをインポートする場合は、パッケージ コードのどこにもlibrary必要ありません。require

編集: R の新しいバージョンでは、R CMD checkを使用すると警告が表示さrequireれ、代わりに を使用するよう提案される場合がありますrequireNamespace。その場合、次のパターンに従うことができます。

## Use the 'bar' function from package 'foo'
if (requireNamespace("foo", quietly = TRUE)) {
    foo::bar()
}
于 2013-03-26T22:41:13.107 に答える
13

参考までに、パッケージのすべての機能を(使用しない場合に)次のようにインポートするのは悪い形式です。

@import package 

だけのほうがいい

package::thisOne()

必要なときや、

@importFrom package thisOne

特定の機能を繰り返し使う場合

于 2015-08-22T19:31:19.460 に答える