gpt4 book ai didi

r - 开发包时如何防止“"r '库”或“'require'调用未声明”警告?

转载 作者:行者123 更新时间:2023-12-03 00:11:08 25 4
gpt4 key购买 nike

我正在开发一个依赖于包 foo 的包,在我的包代码中,有一个对从 foo 导出的函数的调用。我已将包名称包含在 NAMESPACE 中与 import(foo)声明,以及 Imports: DESCRIPTION 中的行文件。但是,运行 R CMD check 时收到以下警告:

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

我错过了什么?

Loading depending packages using .onLoad有类似的问题,但似乎没有讨论这个特定的警告。

最佳答案

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

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

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

Imports: <pkg>

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

import(<pkg>)

通过这样做, <pkg> 中的所有功能的命名空间会自动变得可用,因此不需要 require该包位于代码中的任何位置。

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

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

然后你可以包括 fooDESCRIPTIONSuggests:而不是Imports: 。另一个示例是用于生成小插图的包,但包的用户从不需要。

总之:如果您导入一个包只是为了使用该包的命名空间中导出的函数,则不需要libraryrequire它位于包代码中的任何位置。

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

## Use the 'bar' function from package 'foo'
if (requireNamespace("foo", quietly = TRUE)) {
foo::bar()
}

关于r - 开发包时如何防止“"r '库”或“'require'调用未声明”警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com