我正在开发一个依赖于包foo
的包,并且在我的包代码中调用了从foo
导出的函数。我已使用NAMESPACE
声明在import(foo)
中添加了包名称,并在Imports:
文件的DESCRIPTION
行下添加了该名称。但是,在运行R CMD check
:
r 'library' or 'require' calls not declared from: 'foo'
我错过了什么?
在Loading depending packages using .onLoad有一个类似的问题,但它似乎没有讨论这个具体的警告。
答案 0 :(得分:36)
最有可能的候选人是您的功能包含对require(<pkg>)
或library(<pkg>)
的不必要的调用。错误消息有点误导 - 它告诉您,您已在代码中放置了require
或library
个调用,但实际上(正确地)未在{{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
如果您反复使用特定功能