如何防止" r'库'或者'要求'未宣布的电话"开发包时会发出警告?

时间:2013-03-26 22:41:13

标签: r

我正在开发一个依赖于包foo的包,并且在我的包代码中调用了从foo导出的函数。我已使用NAMESPACE声明在import(foo)中添加了包名称,并在Imports:文件的DESCRIPTION行下添加了该名称。但是,在运行R CMD check

时,我收到以下警告
r 'library' or 'require' calls not declared from: 'foo'

我错过了什么?

Loading depending packages using .onLoad有一个类似的问题,但它似乎没有讨论这个具体的警告。

2 个答案:

答案 0 :(得分:36)

最有可能的候选人是您的功能包含对require(<pkg>)library(<pkg>)的不必要的调用。错误消息有点误导 - 它告诉您,您已在代码中放置了requirelibrary个调用,但实际上(正确地)未在{{1}中声明这些调用文件。

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

最有可能的是,您希望“导入”该软件包,并将其部分或全部导出的函数/符号提供给您的软件包。您可以将此类软件包添加到DESCRIPTION文件中的Imports:字段中,例如

DESCRIPTION

并且类似地,通过在Imports: <pkg> 文件中写入

来声明您要使用该包中的所有导出符号
NAMESPACE

通过执行此操作,import(<pkg>) 命名空间中的所有函数都会自动生成,因此您无需在代码中的任何位置<pkg>打包。

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

foo

然后您可以在if (require("foo")) { #do stuff } foo而不是DESCRIPTION中加入Suggests:。另一个例子是用于制作插图的包,但包的用户从不需要。

总之:如果您只导入包以使用在该包的命名空间中导出的函数,则无需在包代码中的任何位置Imports:library

编辑:在较新版本的R中,require可能会在您使用R CMD check时发出警告,而是建议您使用require。在这种情况下,您可以遵循以下模式:

requireNamespace

答案 1 :(得分:12)

仅供参考,导入包的所有功能(当您不使用它们时)的不良形式:

package::thisOne()

最好只是

@importFrom package thisOne

当您需要时,或

sails lift

如果您反复使用特定功能