13

我同样可以将这个问题命名为“对 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 化的形式在互联网上的某个地方提供这些(例如,将它们作为纯文本函数发布在博客上不是我想要的),以便维护更容易,以便我和其他人可以访问它们来自我使用的任何计算机。合乎逻辑的做法是用它们制作一个包裹并将它们邮寄到 CRAN——事实上我已经把它们打包好了。但是这个函数集合适合 CRAN 包吗?

我有两个主要担忧:

  1. 这些功能似乎没有任何连贯的覆盖。它只是做很多不同事情的函数的集合。
  2. 我的代码并不总是最漂亮的。当我学习了更好的编码实践时,我试图清理它,但是生成 R Core 值得漂亮的代码并不是在卡片中。

CRAN 网页令人惊讶地没有发布指南。我是否应该向 CRAN 发帖,因为有些人会发现它很有用,但在某种意义上它会永远锁定 R 以占用一些非常基本的函数名称?或者还有其他地方我可以使用类似 install.packages 的命令进行安装吗?注意我宁愿避免将包发布到网页上,并且让人们必须记住 URL 才能安装包(尤其是对于版本控制问题)。

4

3 回答 3

5

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

R-Forge 为开发 R 包、R 相关软件和其他项目提供了一个中央平台。它基于 FusionForge,可轻松访问最佳 SVN、每日构建和检查的软件包、邮件列表、错误跟踪、留言板/论坛、站点托管、永久文件存档、完整备份和基于 Web 的管理。

于 2011-07-26T11:18:22.650 回答
4

大多数包应该是具有明显目的的相关功能的集合,所以一个有用的做法是尝试将你拥有的东西组合在一起,看看你是否可以对它们进行分类。几个较小的包比一个巨大的不连贯的包要好。

也就是说,有一些包是杂项实用函数的集合,最值得注意的是Hmiscand gregmisc,所以可以做那种事情。如果你只有几个这样的功能,可能值得联系一些 misc 包的作者,看看他们是否会让你在他们的包中包含你的代码。

至于编写漂亮的代码,您可以做的最重要的事情就是使用样式指南

于 2011-07-26T11:02:54.077 回答
1

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

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

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

  2. 存储库,尤其是 CRAN,是面向任务的,这表明包的功能应该解决一个连贯的任务。并且有一个很好的理由:当我只需要其中几个时,下载一个包含 50 个自主功能的整个包是没有意义的。相反,如果一个包解决了我的特定数据问题,那么我很可能需要其中的大部分(如果不是全部)。

  3. R 存储库倾向于掩盖内容。与技术博客相反,您不会立即看到函数的来源。你需要下载一个单独的源码包,并且由于包结构的原因有很多开销,它隐藏了你愿意展示的实际功能而其他需要阅读的功能。

在我看来,一般便利功能的最佳位置是 GitHub 之类的网站。实际上:

  1. 一个人立即阅读它们与语法高亮的舒适。如果它们很有趣,可以将它们粘贴到 R 中尝试并可能保留它们,否则只需跨步阅读下一个函数。

  2. 可以组织代码,但没有实际包的所有约束。类似的功能可能在同一个文件中,而在同一个子文件夹中的相关文件。

  3. You can show your ideas to the others in a simple way. The readme file can immediately become a sort of mini webpage (via markdown). In comparison CRAN is quite rigid.

There are a lot of other benefits (revision history, accepting contributions, GitHub pages), which may or may not interest you.

Of course, after several functions grow in a stable coherent direction, you will turn them into an actual CRAN package. Also because the copy and paste method to try them becomes then inconvenient.

EDIT: Nowadays there are alternatives to GitHub, which can be taken into consideration too and GitHub has become a common way to distribute packages not yet ready for CRAN or to integrate the official CRAN distribution page.

于 2016-08-14T14:28:37.213 回答