最有可能的候选者是您的函数包含对require(<pkg>)
or的不必要调用library(<pkg>)
。错误消息有点误导 - 它告诉您您已经在代码中放置require
或library
调用,但实际上并没有(正确)在DESCRIPTION
文件中声明这些调用。
如果您打算在自己的包中使用这些包中的代码,那么您不需要这些library
/require
调用;相反,您需要在文件中正确声明您正在使用这些包(以及如何使用它们)DESCRIPTION
。
最有可能的是,您想要“导入”包并使其部分或全部导出的函数/符号可用于您的包。您可以将此类包添加到文件中的Imports:
字段DESCRIPTION
- 例如
Imports: <pkg>
同样,通过在文件中写入来声明您要使用该包中的所有导出符号,NAMESPACE
import(<pkg>)
通过这样做,<pkg>
的命名空间中的所有函数都会自动可用,因此不需要require
在代码中的任何位置使用该包。
在包的上下文中, 的主要用途require
是您希望仅有条件地提供的功能。例如,假设您编写了一个函数来处理一个非常特殊的绘图方法,该方法需要foo
,但foo
在您的包中不需要。因此,如果您想包含有条件地依赖于 package 的代码foo
,您可以编写如下形式的内容:
if (require("foo")) {
#do stuff
}
然后你可以包含foo
在DESCRIPTION
下面Suggests:
而不是Imports:
. 另一个示例是用于制作小插图的包,但您的包的用户从不要求该包。
总之:如果您导入一个包只是为了使用在该包的命名空间中导出的函数,那么您不需要在包代码中的任何地方使用它library
。require
编辑:在较新版本的 R 中,R CMD check
如果您使用require
,可能会发出警告,而是建议您使用requireNamespace
. 在这种情况下,您可以遵循以下模式:
## Use the 'bar' function from package 'foo'
if (requireNamespace("foo", quietly = TRUE)) {
foo::bar()
}