32

背景

我写了一个 R 包,现在一个合作者(最近刚接触 R 的 CS 毕业生)正在编辑和重构代码。在此过程中,他将我的功能划分为更小、更通用的功能。

他正在做的事情是有道理的,但是当我开始使用 时package.skeleton(),每个函数都有一个文件。现在,他添加了主要功能所依赖的功能,但这可能在功能本身之外的用途有限。

他建议将所有功能都放在一个文件中,但我反对这一点,因为当我们处理不同的文件时更容易进行版本控制。

从那以后,我开始使用 roxygen 来记录文本中的每个函数。

问题

处理函数的推荐方法是什么:显然辅助函数应该保留在主函数中,但是我需要在多大程度上记录辅助函数?

评论中的@export建议很有帮助,但我很想知道其他人如何组织他们的代码。

4

1 回答 1

32

我在两种情况下削减了我的功能:

  1. 当它提高主函数代码的可读性时,和/或
  2. 当它避免复制粘贴代码时,例如,如果在同一个函数中多次使用相同的代码。

我确实在主函数的文件中包含了所谓的辅助函数,但前提是这些辅助函数没有在任何其他函数中使用。实际上,我认为它们嵌套在 main 函数中。我确实理解您关于版本控制的论点,但更改辅助函数归结为更改主函数的性能,所以我认为将它们保存在同一个文件中没有问题。

一些辅助函数可能会在不同的其他函数中使用,然后我将它们保存在自己的文件中。我经常会导出这些功能,因为它们可能会引起用户的兴趣。将此与 eglm和底层进行比较lm.fit,高级用户可以适当地使用它们lm.fit来加速代码等。

我使用在相当多的包(并从 linux 派生)中使用的命名约定,通过在每个“隐藏”函数前面加上一个点。所以这使得

.helper.function <- function(x, ...){
    ... some code ...
}

main.function <- function(x, ...){
    ...some code, including .helper.function(y, ...)
}

我明确地@export 所有需要导出的函数,而不是辅助函数。判断一个功能是否会引起最终用户的兴趣并不总是那么容易,但在大多数情况下,这很清楚。

举个例子: 几行代码来切断 NA 行我认为是一个辅助函数。将数据集转换为我导出和记录的正确格式的更复杂的功能。

YMMV

于 2011-03-31T00:28:54.253 回答