【问题标题】:r package development: When to use ::r包开发:何时使用::
【发布时间】:2026-02-10 11:15:02
【问题描述】:

关于编码约定的问题:我正在开发一个 r 包,我想将它提交给 cran。所有外部函数都正确导入到 NAMESPACE 文件中。我是否必须使用 :: 在我的源代码中指定包,或者通过在命名空间中提供导入一切都很好?例子 在 NAMESPACE 中,有类似

importFrom(stats, formula, ave, aggregate, median, sd, qnorm, rnorm, runif)

在使用例如 rnorm 时我是否必须明确调用统计信息

random <- stats::rnorm(100, m = 0, sd = 1)

或者我可以省略关于 cran 政策的“stats::”吗?

【问题讨论】:

  • 在代码中使用stats::肯定会更好。

标签: r dependencies


【解决方案1】:

如果您使用importFrom,则不是必需;来自 Hadley Wickham 的R Packages

如果您只使用另一个包中的几个函数,我的 建议在 Imports: 字段中记下包名 描述文件并使用 :: 显式调用函数, 例如,pkg::fun()。运算符也可以通过类似的方式导入, 例如,@importFrom magrittr %>%.

如果你重复使用函数,你可以通过导入来避免 :: @importFrom pkg 的函数很有趣。这也有一个小 性能优势,因为 :: 增加了大约 5 µs 的运行时间 评估时间。

然而,许多人认为使用:: 是一种很好的做法,可以使您的代码清晰易读;如果有人查看您的源代码,他们就会准确地知道您调用的函数来自哪里。

【讨论】:

  • 非常感谢(感谢所有人)的快速解答。所以调用或多或少是重复调用的性能问题,例如。 G。我猜在迭代函数中,如果这不是问题,应该添加 :: 以提高可读性,对吧?从我自己的包中调用函数呢?应该添加 :: 还是一般不添加?
  • @user1227776 没错。我几乎总是使用:: 来解决可读性问题,但是对于重复调用,您可以获得性能。每次使用 :: 只会增加大约 5 微秒,所以这取决于您和高度上下文取决于它是否足以提高性能以妨碍可读性。
  • @user1227776 我刚刚注意到您评论中的最后一句话。你不需要:: 来获取你自己包中的函数。
【解决方案2】:

您无需在代码中使用::。导入这些项目使它们在本地可用。

正如 Nicola 所说,您可以使用 :: 是有争议的。它清楚地表明了函数的来源。但是,如果您确实使用了::,则导入该函数没有任何意义:导入命名空间的rnorm 对象将被忽略。

对于我自己,我会导入而不是使用::。调用导入的函数比调用:: 来解析对外部包的调用具有更少的开销。

【讨论】: