为什么以及何时创建R包?


28

我知道这个问题是一个广泛的问题,但是我想知道决定为R创建(或不为)新程序包的决定性要点是什么。更具体地说,我要补充的是,问题不在于本身使用R,更多是关于编译各种脚本并将其集成到新程序包中的决定。

在可能导致这些决定的要点中,我想到了(以非穷尽的方式):

  • 同一子域中其他软件包的不存在;
  • 需要与其他研究者交流并允许实验重现;

在可能导致相反决定的要点中:

  • 其他软件包已经使用的部分方法;
  • 新功能的数量不足以创建新的独立程序包。

我可能已经忘记了两个列表中可能包含的许多要点,而且这些标准似乎在一定程度上是主观的。因此,您要说什么才有道理,什么时候开始将各种功能和数据汇总到一个新的有文档记录且广泛使用的软件包中?

Answers:


17

我没有用R编程,但是我用其他语言编程,在这里我没有看到R特定的问题。

我想大多数人首先写东西是因为他们自己真正想要它。相反,应该坚决抵制因为要这样做而应该发布软件的任何感觉。聪明的人可能是糟糕的程序员,而且经常是这样。

公开上市似乎是要确信自己拥有的东西与已经公开的东西一样好或更好,并且可以填补空白。知道其他人也想做同样的事情肯定会有所帮助。

如果您有疑问,请不要发布。在许多社区中,存在着由不重要或经验不足的程序员发布的中等或错误软件的质量控制问题,尽管问题的严重程度尚待商debate。乐观主义者认为琐事可以忽略不计,用户会足够快地发现错误和局限性。悲观主义者认为我们淹没在劣质产品中,很难告诉失败者中的胜利者。(另一方面,从发布中获得的经验是使程序员得以改进的一部分。)

可能会有关于这本书的书,但有几点需要注意:

  1. 优质的文档可以区分优质的软件和优质的代码,实际上有时更为明显。永远不要低估提供代码应有的文档将需要多少工作。R程序员经常似乎要求R用户对正在实施的技术和他们的文档了解最少。

  2. 尽可能测试您的代码,以便可以使用其他地方的真实数据来复制已发布的解决方案。(如果您要编写全新的代码,可能会比较困难,但并非不可能。此外,您可能经常会怀疑自己是自己的错误还是自己的错误。)

  3. 程序员经常低估了用户在程序中抛出不合适数据的能力。因此,请考虑可能出问题的地方,例如,缺少值,如果程序假定为正数则为零等。(此处的良心做法是,用户应根据自己的反馈来发现问题并改善代码,这是工作的责任。 ,但是容易崩溃的程序不会提高您的声誉。)


1
我不能完全同意这三点(尽管第二点不适用于我的特殊情况,因为我设计了有问题的方法)。第三点是非常重要的一点,更普遍地提出了人们可以期望的用户信息水平的问题(或者:对于谁,我们发布软件包):我们应该只为熟悉该领域的专家编码吗使用现有方法,还是尝试让尚未阅读所有相关文章的感兴趣的学者使用我们的软件包?
Jean-Baptiste营地

2
#2始终适用于“测试您的代码”!最后一点,不同的人有不同的风格,没有正确的答案。您可能会认为,在其他地方解释清楚的内容不是程序员的工作,或者只是通过解释用法来编写程序文档是徒劳的。在我活跃的Stata社区中,好的文档似乎广受赞赏,并且缺少文档是一个问题,但是R社区必须有自己的特色。
尼克·考克斯

关于告诉失败者的获胜者以及您的非常正确的观点:#1:幸运的是,R中的一些观点可以轻松地检查出来,并且这些观点指向比正式的帮助页面更好的文档。是否提供了小插图(sos::findFn发现该标准足够重要,可以将该信息放入结果表中!)?演示?包含更多信息的网页?确实citation提供了适当的论文或第二本书,您可能会在代码中附带示例数据,因此,即使没有其他实现可以针对您的代码进行测试,现在其他人也可以针对您的代码进行测试。
cbeleites支持Monica

1
“ R程序员似乎经常要求R用户对所实施的技术有同样的了解,并且对文档的了解最少。”-区分代码文档和统计方法非常重要。R文档绝对不是学习stat方法的地方。甚至小插图都具有一定的复杂性。太多的人抱怨R中的文档很少,实际上等于抱怨这些文档并没有为他们提供统计知识。
joran

2
省略号……意在表示担心。R社区应该制定自己的标准,或者至少要对它们进行辩论。
尼克·考克斯

14

这是一个重要而实际的问题。让我们首先区分编写程序包和在CRAN上发布程序包。

写包裹的原因:

  • 成本效益。
  • 缺乏经验。

编写R包的原因:

  • 与人和平台共享。
  • 强制执行整洁的代码和工作流程。
  • 当函数开始累积时,易于使用(甚至用于自身)。

提交包裹的原因(CRAN,Bioconductor等):

  • 对社区的贡献。
  • 易于分发。

7
我想补充一点,经验不足也是一个原因写的R包。第一次编写一个程序包不仅很有趣,而且是一个挑战,但实际上可以帮助人们提出有关如何设计对自己和社区有用的“适当”程序包的想法。换句话说,即使缺乏经验,编写软件包还是要有经验的好主意。
Graeme Walsh

1
对于不那么经验丰富的R程序员(他会犹豫要去设计一个包),您的观点Grame是一种非常有动力的观点。另一方面,尽管这肯定会自己实现,但我注意到两个答案都强调(并且我也可以理解)对干净,高效且无错误的代码的编程和科学需求。因此,这提出了一个新问题,可能是“如何确保R程序包中没有错误?”,这应该是社区的工作,但是新程序包的数量增加可能会限制这一点。
Jean-Baptiste营地

这肯定会回到您的观点,即编写软件包(例如,获取经验)与实际执行下一步并发布软件包之间存在很大的差异。cbeleites告诉我们,他使自己的程序包“半公开”,我认为他的方法包含如何确保R程序包没有错误(或更确切地说,将错误的可能性降至最低)的要素。本质上,某种形式的同行评审或测试阶段是帮助确保R软件包质量良好的一种方法。如果涌现出太多的程序包而没有检查,它们可能就没有那么有用了。
Graeme Walsh

12

请记住,这里有选项3。您可以要求相关软件包的维护者包括您的代码或数据。


8

我个人的包装触发因素是:

  • 我发现我再次使用曾经为另一个数据分析项目编写的代码。
  • 我想我需要我刚写的方法。
  • 一位同事问我代码。我编写的代码中,很大一部分至少是应同事(他们使用R但自己没有编写太多程序)的要求和自己的要求一样多的。

  • 我使用软件包的正式要求(文档)来“强制”我清理并记录代码。

我同意@JohnRos的观点,即写程序包和发布程序包之间有很大的区别。

  • 我通常会提早打包,但随后将其打包为“ semipublic”。也就是说,它可能在内部服务器(或r-forge)上可用,因此我的同事可以访问该程序包。但是,只有在密友使用了数月甚至数年后,我才向CRAN发布。根据@Nick Cox的观点#3,这并不会引发所有错误,但是其中有相当数量的错误。
    软件包的版本(我在版本号中的破折号后加上了日期)可以很容易地进行修复(“为此,请确保您至少安装了上周的版本”)

  • 根据我的工作合同,我的雇主在决定是否以及如何将软件包发布到外界方面拥有最终决定权。

我还没有好的打包策略的地方就是数据。


对您的原因列表的评论:

  • 同一子域中其他软件包的不存在;

没有找到一个包,做什么,我需要对我触发编写的代码,但它不具有决定是否打包或不做。

  • 需要与其他研究者交流并允许实验重现;

确定地。可能已经需要在我使用的多台计算机之间共享。

在可能导致相反决定的要点中:

  • 其他软件包已经使用的部分方法;

您可以将这些方法导入到您的包/代码中:这是反对编写此类代码的要点,但仅与打包有间接关系。

  • 新功能的数量不足以创建新的独立程序包。

对我来说,启动软件包没有最小数量的功能。根据我的经验,软件包倾向于“自动”增长。相反,在发现自己几次从另一个新程序包中分支出来之后(因为例如最终某些辅助功能在主题上也有所不同,并且在其他情况下也很有用),我现在宁愿立即创建新软件包。

另外,如果您没有编写文档和测试,那么当用于创建软件包的大量功能累积时,这可能是一项艰巨的工作。
(如果您确实立即编写它们,那么一旦您知道工作流程,将其放入包中的额外工作就可以忽略不计)。


3
+1。使程序包成为半公开的另一个好方法是将程序包源放在GitHub上-它使代码更易于查找,并鼓励其他人做出贡献,而无需在CRAN上隐式修饰程序包。
马特·帕克

7

我想说的是,只要您在R中执行足够大的一组类似任务,就可以创建一个包,您将从其中可以将其放入命名空间(以避免与名称相似的函数发生冲突)的包中受益。文档。我什至在github上有一个软件包,用于捆绑不相关的功能,但是我经常使用,以至于我认为它们值得文档,手册文件等。

另一个用例是提交论文时,如果您具有许多功能,则可以轻松创建一个程序包,包括这些功能的文档,每个功能的示例以及如何使用它的教程。而且您不必像上面的答案中所述将其放在CRAN上。这对于重现性可能很棒。

我要说的三个工具很重要:

  • devtools pkg,使构建软件包超级容易(另请参阅devtools github页面上的wiki)
  • roxygen2 pkg,使包装文件的编写变得容易
  • GitHub,您可以使用install_github(或类似的install_bitbucket等)直接从GitHub安装,非常适合与他人共享。

5

我同意到目前为止所读的所有内容。所有这些原因都是良好的编程习惯,尤其不适用于R。但是,我发现自己大部分时间都在写R包,还有另一个原因。因此,我将添加:

编写R包的特定于R的原因:

  • 因为你用C写

每当您使用诸如C,C ++或FORTRAN(主要用于高性能计算)之类的外语时,编写软件包在很大程度上都是值得的。如果您具有一个或两个以上的功能,那么您很快就会在各处获得文件,并且R和C代码之间的依赖关系很难维护和移植。


0

其他出色的答案中未提及的一个原因:您有大型或复杂的数据分析项目。首先,将数据打包为一个包装,然后使用有用的功能进行扩展,以转换,绘制或计算特定的分析。这样,您可以获得完整的数据文档版本,其中包含用于计算报告的分析的所有功能。然后,可以使用knitr或其他软件包编写该项目的报告,以进行可重复的研究!

如果必须进行一些重新分析,则可以大大节省时间;如果发布了分析,则可以将其发布(或半发布)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.