46

我正在开发一个依赖于 package 的包foo,并且在我的包代码中调用了一个从foo. 我已经在声明中包含了包名NAMESPACEimport(foo)也在文件的Imports:行下DESCRIPTION。但是,我在运行时收到以下警告R CMD check

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

我错过了什么?

在使用 .onLoad 加载依赖的包中有一个类似的问题,但它似乎没有讨论这个特定的警告。

4

2 回答 2

47

最有可能的候选者是您的函数包含对require(<pkg>)or的不必要调用library(<pkg>)。错误消息有点误导 - 它告诉您您已经在代码中放置requirelibrary调用,但实际上并没有(正确)在DESCRIPTION文件中声明这些调用。

如果您打算在自己的包中使用这些包中的代码,那么您不需要这些library/require调用;相反,您需要在文件中正确声明您正在使用这些包(以及如何使用它们)DESCRIPTION

最有可能的是,您想要“导入”包并使其部分或全部导出的函数/符号可用于您的包。您可以将此类包添加到文件中的Imports:字段DESCRIPTION- 例如

Imports: <pkg>

同样,通过在文件中写入来声明您要使用该包中的所有导出符号,NAMESPACE

import(<pkg>)

通过这样做,<pkg>的命名空间中的所有函数都会自动可用,因此不需要require在代码中的任何位置使用该包。

在包的上下文中, 的主要用途require是您希望仅有条件地提供的功能。例如,假设您编写了一个函数来处理一个非常特殊的绘图方法,该方法需要foo,但foo在您的包中不需要。因此,如果您想包含有条件地依赖于 package 的代码foo,您可以编写如下形式的内容:

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

然后你可以包含fooDESCRIPTION下面Suggests:而不是Imports:. 另一个示例是用于制作小插图的包,但您的包的用户从不要求该包。

总之:如果您导入一个包只是为了使用在该包的命名空间中导出的函数,那么您不需要在包代码中的任何地方使用它libraryrequire

编辑:在较新版本的 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 回答