我已经阅读了 R 包书中的部分,但我仍然有点困惑。我想用例如我自己的小包中的
fromJSON
包中的 jsonlite
功能。
我有点不确定该怎么做,这些是我正在考虑的问题/选项:
每次使用
fromJSON
函数时,我都可以使用 ::
运算符来预定义它,例如 jsonlite::fromJSON
。我想为了使其工作,我需要将其放入导入下的 DESCRIPTION
文件中。这样,如果安装了我的软件包,则始终会安装 jsonlite
软件包。这是好的做法吗?
如果我这样做,为什么我要把
@importFrom jsonlite fromJSON
放在我的 roxygen 评论中。我知道它将行 importFrom(jsonlite, fromJSON)
添加到 NAMESPACE
文件中。但这条线的优势或想法是什么?
过去,我经历过其他包中的函数也会出现在我自己的包下,例如
importFrom(jsonlite, fromJSON)
线有关吗?
我将不胜感激任何提示!:)
我的两便士(价值五美分):
我更喜欢你的第一个选择,用(例如)
jsonlite::fromJSON
来引用外部函数 - 因为(对我来说)这是引用函数源的唯一立即明确的方式。这就是我在我编写或贡献的包中所做的。
如果您打算只在本地使用您的软件包,我相信这就是您需要做的。但是,如果您计划以非正式方式或在 CRAN 上发布您的软件包,您应该(或将需要)做更多事情。
最简单的选项是使用
usethis::use_package()
将包添加到您的描述文件中。如果您不这样做,非正式分发的软件包将(我认为)安装,但用户在运行引用外部函数的代码时会收到错误,除非他们独立安装了所需的软件包。 CRAN 提交将会失败。 (也会devtools::check()
。)
您可以在使用外部函数的每个函数前面使用
@importFrom
。这还将添加对 NAMESPACE 文件的必要引用,并允许您在函数体内引用无作用域的函数。这是一些人觉得方便的简写,但我个人不喜欢它。为什么?因为你的函数可能会使用像 filter
这样的函数。仅看函数代码,读者不知道 this 指的是(比如说)dplyr::filter
还是stats::filter
。读者可以通过查看函数顶部的注释来找到答案,或者他们可以假设。充其量,这只是一点额外的努力。在最坏的情况下,假设可能会导致错误。它还允许您为某些函数指定 @importFrom stats
,为其他函数指定 @importFrom dplyr
。这是不明确的并且可能容易出错。
除了询问您是否从自己的包中导出这些第三方函数之外,我无法评论您的第三点。