向R核心团队提出功能请求

时间:2011-11-09 13:39:45

标签: r open-source

联系R核心团队以建议功能请求的推荐方式/工作流程是什么?

通过“功能请求”我不仅仅意味着触发“我希望看到功能XY执行XY的事情,所以如果你继续为我实现这个功能会很酷”,但提出实际的代码代替。

我爱R并愿意贡献,分享代码等等。但有时候我觉得有点难以弄清楚 如何 贡献;-)我看了R Project Developer Page并使用了r-devel邮件列表几次。特别是对于后者,我得到的印象是,它不是正确的地方/不希望用实际代码详细说明一个人的功能请求(有时可能不仅仅是两个班轮)。所以我想知道是否有一种“更好”或更“系统”的方式来做到这一点。

编辑2011-11-09

我被要求提供一个简短的例子:

我正在广泛使用S4 Reference Classes并为我的对象实现了许多小实用程序功能。一个这样的效用函数是某种“重置”功能:

setRefClass(
    "A", 
    fields=list(a="numeric", b="character"),
    methods=list(
        reset=function(fields=NULL, ...){
            temp <- new("A")
            if(is.null(fields)){
                fields <- names(getRefClass("A")$fields())
            }
            sapply(fields, function(x){
                .self$field(name=x, value=temp$field(x))        
            })
            return(TRUE)
        }
    )
)

x <- new("A", a=1:10, b=letters[1:10])

x$a
x$b
x$reset(fields="a")

x$a
x$b

x$reset()
x$a
x$b

很多时候,这不是世界上最精彩的功能,而是出现在我的“哦,那个缺失”列表中。此外,它可能是一种“单一”功能,开发整个包装有时会感觉像是用大锤敲打坚果。

4 个答案:

答案 0 :(得分:36)

这是一个很好的问题。虽然我非常喜欢R,但我发现它的开发模式有时令人沮丧。我会说最好的选择是

  1. 将最初的想法(没有广泛的代码)发布到R-devel,看看你是否可以得到讨论/热情。你必须愿意推动:例如,几年前我设法在sweep中加入了一些额外的错误检查(实际上它抱怨了不匹配的维度而不是默默地回答错误的答案),但只是在提出这个想法之后;等一个星期;重新提出这个想法;发送一些原型代码;测试它以确保它不会导致性能损失;进一步讨论......
  2. 将您的想法作为附加包实现。如果您提出的是改变核心R功能(另一方面,这种变化也将更难被接受),这当然要困难得多。另一方面,您可以在附加软件包中实现任何您想要的任何东西,它有几个优点。 (1)您的代码将立即供所有人使用(如果您使用R-forge,Rforge或CRAN发布); (2)这是一种方法,可以在没有购买R核心的情况下开发和完善; (3)即使它在R-core中永远不会被接受,它仍然会作为一个包裹。
  3. 编辑:尝试查找现有的实用程序或“misc”程序包以供参与(例如,我已经为Jim Lemon的plotrix程序包做出了贡献,这是一个小型绘图的汇编公用事业),并联系维护者/作者。
  4. 将您的愿望清单项目发布到R bug跟踪器(带代码附件等)。但是,与使用选项#1或#2相比,他们会被更少的人看到,因此更有可能在错误跟踪器中萎靡不振而没有看到光明的一天。

答案 1 :(得分:26)

除非i)它引起R核心开发团队之一的兴趣,否则你不太可能在基础R本身中获得新功能,或者ii)是现有功能的扩展,改进了它的工作方式或使其成为可能效率更高 R Core的成员对此感兴趣。你当然可以在愿望清单标准下提交一个错误,并提供代码,但如果R核心团队不接受全新的功能,即使它们附带代码,也不要感到惊讶。

之前曾讨论过这种立场的原因;即使您提供实现新功能X以包含在R中的代码,您也会将维护负担转嫁给R核心团队,这些人员只有有限的资源和时间来执行此操作。 R核心团队为了自己的兴趣/研究/需求,有效地开发了R的基础。

由于R软件包几乎是一等公民,因此几乎没有理由要求R核心实现或包含您的功能X代码。因此,正如其他人所说的那样,在您自己的软件包中实现您的创意功能将它们提供给另一个已经提供与您的新功能X相关的代码的包。

即使是非常有用的广泛使用的包,例如 data.table 不太可能在短期内成为基础R,因为它们会增加代码库的复杂性,给R核心团队带来维护负担,和/或不会下降替换现有代码; data.table 提供类似数据框的扩展,速度极快,更适合大数据集和对这些数据的“查询”。但它与R的数据帧不兼容,采用不同的约定。它可以作为一个包使用,并且可以继续这样做,而无需 in R.

以上描述了我看到的新功能的情况。对于错误报告,请提交错误报告!然后考虑继续进一步讨论R-Devel引用错误报告ID。为支持您的错误报告而提供的修补程序将更容易修复错误或添加新功能/增强功能。补丁应包括需要更改的R源以及需要更改的任何文档的补丁。补丁应该针对the R SVN server处的SVN树。正如@BenBolker在评论中提到的,错误报告最好在R的错误报告网站中提交。任何有关R-Devel上的错误的讨论都应链接到错误报告。这样虫子就不会陷入裂缝中而错过了。

答案 2 :(得分:15)

通常的方法是编写一个包,并将其放到CRAN上。 (发送到包列表的所有公告都会被复制到rhelp。)然后使用rhelp(或者可能是SO)演示它的生产用途会引起注意。我想到了多年来Hadley Wickham,Dirk Eddelbuettel,Terry Therneau,Gabor Grothendieck,Frank Harrell和Matthew Dowle所做的努力,他们想起了前六位的贡献者,他们让我的R工作更有成效。实际上,当我写这个名单时,它会越来越长,我向其他几个经常做出贡献的人道歉。

答案 3 :(得分:14)

今年在useR上,Brian Ripley讲述了解释R-core团队立场的轶事。他说他接受了一个来自备受尊敬的R程序员(John Chambers的函数的两行补丁,如果我没记错的话)。这两行代码包含三个错误(!),然后他必须修复它们。从那时起,R-core的默认位置是拒绝对R-base的功能请求,即使是那些提供代码的功能。 (错误修复请求很好,只要你高音检查它确实是一个错误。请使用R Bug Tracking System。)

虽然不可能将某些内容放入R-base中,但几乎总是显着(p <1e-6)更容易自己创建包或添加到现有包中。