我写了一个R包,现在是一个合作者(最近的CS毕业生,他是R的新手)正在编辑和重构代码。在这个过程中,他将我的功能划分为更小,更通用的功能。
他的所作所为是有道理的,但当我开始使用package.skeleton()
时,每个函数都有一个文件。现在,他已经添加了主要功能所依赖的功能,但这可能在功能本身之外的使用有限。
他建议所有函数都放在一个文件中,但我反对,因为当我们处理不同的文件时,更容易进行版本控制。
我已经开始使用roxygen记录文本中的每个功能。
处理函数的推荐方法是什么:显然辅助函数应该与main函数保持一致,但是我需要在多大程度上记录辅助函数?
评论中的@export
建议很有帮助,但我很想知道其他人如何组织他们的代码。
答案 0 :(得分:27)
我在两个条件下削减了我的功能:
我确实在main函数的文件中包含了所谓的辅助函数,但只要这些辅助函数不在任何其他函数中使用。实际上,我认为它们嵌套在main函数中。我确实理解你的版本控制论证,但更改辅助函数归结为改变main函数的性能,所以我认为将它们保存在同一个文件中没有问题。
某些辅助函数可能会在不同的其他函数中使用,然后我将它们保存在自己的文件中。我经常导出这些功能,因为它们可能对用户有用。将此与例如lm
和基础lm.fit
进行比较,其中高级用户可以正常使用lm.fit
来加快代码等。
我使用相当一些包中使用的命名约定(并从linux派生),通过点前面的每个“隐藏”函数。这样做
.helper.function <- function(x, ...){
... some code ...
}
main.function <- function(x, ...){
...some code, including .helper.function(y, ...)
}
我明确地@export所有需要导出的函数,而不是辅助函数。判断一个函数是否可能对最终用户感兴趣并不总是很容易,但在大多数情况下它非常清楚。
举一个例子:几行代码来切断NA行我认为是辅助函数。一个更复杂的功能,可以将数据集转换为我导出和记录的正确格式。
YMMV