在其他包中使用 R 包中的函数:何时以及如何使用 importFrom、:: 和导入

问题描述 投票:0回答:1

我已经阅读了 R 包书中的部分,但我仍然有点困惑。我想用例如我自己的小包中的

fromJSON
包中的
jsonlite
功能。

我有点不确定该怎么做,这些是我正在考虑的问题/选项:

  1. 每次使用

    fromJSON
    函数时,我都可以使用
    ::
    运算符来预定义它,例如
    jsonlite::fromJSON
    。我想为了使其工作,我需要将其放入导入下的
    DESCRIPTION
    文件中。这样,如果安装了我的软件包,则始终会安装
    jsonlite
    软件包。这是好的做法吗?

  2. 如果我这样做,为什么我要把

    @importFrom jsonlite fromJSON
    放在我的 roxygen 评论中。我知道它将行
    importFrom(jsonlite, fromJSON)
    添加到
    NAMESPACE
    文件中。但这条线的优势或想法是什么?

  3. 过去,我经历过其他包中的函数也会出现在我自己的包下,例如 ::fromJSON。这与

    importFrom(jsonlite, fromJSON)
    线有关吗?

我将不胜感激任何提示!:)

r r-package roxygen2
1个回答
0
投票

我的两便士(价值五美分):

我更喜欢你的第一个选择,用(例如)

jsonlite::fromJSON
来引用外部函数 - 因为(对我来说)这是引用函数源的唯一立即明确的方式。这就是我在我编写或贡献的包中所做的。

如果您打算只在本地使用您的软件包,我相信这就是您需要做的。但是,如果您计划以非正式方式或在 CRAN 上发布您的软件包,您应该(或将需要)做更多事情。

最简单的选项是使用

usethis::use_package()
将包添加到您的描述文件中。如果您不这样做,非正式分发的软件包将(我认为)安装,但用户在运行引用外部函数的代码时会收到错误,除非他们独立安装了所需的软件包。 CRAN 提交将会失败。 (也会
devtools::check()
。)

您可以在使用外部函数的每个函数前面使用

@importFrom
。这还将添加对 NAMESPACE 文件的必要引用,并允许您在函数体内引用无作用域的函数。这是一些人觉得方便的简写,但我个人不喜欢它。为什么?因为你的函数可能会使用像
filter
这样的函数。仅看函数代码,读者不知道 this 指的是(比如说)
dplyr::filter
还是
stats::filter
。读者可以通过查看函数顶部的注释来找到答案,或者他们可以假设。充其量,这只是一点额外的努力。在最坏的情况下,假设可能会导致错误。它还允许您为某些函数指定
@importFrom stats
,为其他函数指定
@importFrom dplyr
。这是不明确的并且可能容易出错。

除了询问您是否从自己的包中导出这些第三方函数之外,我无法评论您的第三点。

© www.soinside.com 2019 - 2024. All rights reserved.