如何处理不完善但有用的功能?

时间:2011-07-26 10:53:24

标签: r package cran

我同样可以提出这个问题:“这对CRAN来说还不错吗?”

我有一系列我为特定任务建立的功能。其中一些是便利功能:

# Returns odds/evens from a vector
odds=function(vec) {
    stopifnot(class(vec)=="integer")
    ret = vec[fpart(vec/2)!=0]
    ret
}
evens=function(vec) {
    stopifnot(class(vec)=="integer")
    ret = vec[fpart(vec/2)==0]
    ret
}

有些是次要的补充,已被证明对回答常见的SO问题很有用:

# Shift a vector over by n spots
# wrap adds the entry at the beginning to the end
# pad does nothing unless wrap is false, in which case it specifies whether to pad with NAs
shift <- function(vec,n=1,wrap=TRUE,pad=FALSE) {
    if(length(vec)<abs(n)) { 
        #stop("Length of vector must be greater than the magnitude of n \n") 
    }
    if(n==0) { 
        return(vec) 
    } else if(length(vec)==n) { 
        # return empty
        length(vec) <- 0
        return(vec)
    } else if(n>0) {
        returnvec <- vec[seq(n+1,length(vec) )]
        if(wrap) {
            returnvec <- c(returnvec,vec[seq(n)])
        } else if(pad) {
            returnvec <- c(returnvec,rep(NA,n))
        }
    } else if(n<0) {
        returnvec <- vec[seq(1,length(vec)-abs(n))]
        if(wrap) {
            returnvec <- c( vec[seq(length(vec)-abs(n)+1,length(vec))], returnvec )
        } else if(pad) {
            returnvec <- c( rep(NA,abs(n)), returnvec )
        }

    }
    return(returnvec)
}

最重要的是在其他任何地方都找不到的现有类的扩展(例如,格子图的CDF面板函数,各种xtable和LaTeX输出函数,用于处理和转换地理空间对象类型以及执行各种GIS的类 - 像叠加等操作。

我想在互联网上以R-ized形式提供这些内容(例如将它们发布在博客上,因为纯文本功能不是我正在寻找的),因此维护更容易,所以我和其他人可以从我去过的任何电脑上访问它们。合乎逻辑的做法是从它们中创建一个包并将它们发布到CRAN - 事实上我已经把它们打包了。但这个功能集合是否适合CRAN包?

我有两个主要问题:

  1. 这些功能似乎没有任何连贯的叠加。这只是一个 执行许多不同事物的函数集合。
  2. 我的代码并不总是最漂亮的。我试着像我一样清理它 学会了更好的编码实践,但产生了R Core-worthy beautiful 代码不在卡片中。
  3. CRAN网页令人惊讶地失去了发布指南。我应该发布到CRAN,因为有些人会觉得它很有用但是在某种意义上它会永远锁定R使一些非常基本的函数名称被占用?或者是否有另一个地方我可以使用install.packages-like命令来安装?注意我宁愿避免将包发布到网页上,让人们记住URL来安装包(尤其是版本控制问题)。

3 个答案:

答案 0 :(得分:5)

我会使用http://r-forge.r-project.org/。从页面顶部:

  

R-Forge为R软件包的开发提供了一个中央平台,   R相关软件和进一步的项目。它基于FusionForge   提供轻松访问最好的SVN,每日建立和检查   包,邮件列表,错误跟踪,留言板/论坛,网站   托管,永久文件存档,完整备份和基于Web的总计   施用

答案 1 :(得分:4)

大多数软件包应该是具有明显目的的相关函数的集合,因此有用的事情是尝试将所有内容组合在一起,并查看是否可以对它们进行分类。几个较小的封装比一个非常不连贯的封装更好。

也就是说,有些软件包是各种实用函数的集合,最值得注意的是Hmiscgregmisc,所以可以这样做。如果您只是有一些这样的功能,可能需要联系一些misc软件包的作者,看看他们是否允许您将代码包含在他们的软件包中。

至于编写漂亮的代码,你可以做的最重要的事情是使用a style guide

答案 2 :(得分:1)

在我看来,将这种类型的材料制成包装并不是一个好主意 Misc-packages 确实存在,但主要是出于历史原因和/或由于其权威贡献者,请参阅Frank Harrell Hmisc。

我看到这个选择不适合不同功能集合的三个主要原因。

  1. 仅在CRAN上有7000个大包。如果不针对特定字段,则不太可能选择您的软件包,即使发生这种情况,其他已建立的软件包也很可能会这样做。因此,您的包装还应该针对其处理的问题提供原创/更好的解决方案。

  2. 存储库,特别是CRAN,是面向任务的,它建议包装&#39;功能应该解决一个连贯的任务。并且有一个很好的理由:当我只需要其中几个时,下载一个包含50个自主功能的整个软件包是没有意义的。相反,如果一个包解决了我的特定数据问题,那么我最有可能需要它们(如果不是全部的话)。

  3. R存储库倾向于掩盖内容。与科技博客相反,您不会立即看到功能&#39;资源。您需要下载一个单独的源程序包,由于程序包结构会产生大量开销,这会掩盖您愿意显示的实际功能以及其他需要阅读的功能。

  4. 在我看来,一般便利功能的最佳位置是像GitHub这样的网站。事实上:

    1. 立即用语法高亮显示它们。如果它们很有趣,可以将它们粘贴在R中进行尝试并可能保留它们,否则只需简单地跳过来阅读下一个功能。

    2. 有可能组织代码,但没有实际包的所有约束。类似的函数可能放在同一个子文件夹中的同一个文件和相干文件中。

    3. 您可以通过简单的方式向其他人展示您的想法。自述文件可以立即成为一种迷你网页(通过降价)。相比之下,CRAN非常严格。

    4. 还有很多其他好处(修订历史记录,接受贡献,GitHub页面),可能会或可能不会让您感兴趣。

      当然,在几个函数以稳定的相干方向增长之后,您将把它们转换为实际的CRAN包。另外,因为尝试复制和粘贴方法会变得不方便。

      编辑:现在有GitHub的替代方案,也可以考虑,GitHub已成为分发尚未准备好CRAN或整合官方CRAN分发页面的常用方法。