2012-02-16 103 views
19

我刚刚注意到的require()library()函数没有version的参数。当人们需要确保他们至少有一些最低版本的软件包时,他们做了什么,例如他们知道一些错误是固定的,或者某些功能可用,或者其他什么?需要R包的最低版本

我知道的东西Depends对于包的作者,但我正在寻找的东西在脚本中,互动的环境,org-mode文件,代码片段用等

回答

7

我不知道这样的功能,但制作一个应该很容易。您可以将其基于sessionInfo()packageVersion()。加载脚本所需的包后,您可以从那里收集包号。来检查版本号的功能看起来像(伪代码,因为我没有时间,现在):

check_version = function(pkg_name, min_version) { 
    cur_version = packageVersion(pkg_name) 
    if(cur_version < min_version) stop(sprintf("Package %s needs a newer version, 
       found %s, need at least %s", pkg_name, cur_version, min_version)) 
} 

调用它会像:

library(ggplot2) 
check_version("ggplot2", "0.8-9") 

你仍然需要将版本号解析为允许比较的东西cur_version < min_version,但基本结构保持不变。

+3

感谢。看起来像'compareVersion()'是用于版本比较的正确选择。 – 2012-02-16 18:16:13

+0

真棒那功能在那里,试图自己做一些东西,但那不需要:)。 – 2012-02-16 18:23:40

+0

@KenWilliams - 很好。我看了一下,并且在帮助页面的声明中被抛出轨道:“R软件包版本号的形式为'x.y-z'”。但它在实际上看起来像在'' - “'和'”。“''上都是strsplit(),所以细节并不重要。 – 2012-02-16 20:58:31

14

你可以使用packageVersion()

packageVersion("stats") 
# [1] ‘2.14.1’ 

if(packageVersion("stats") < "2.15.0") { 
    stop("Need to wait until package:stats 2.15 is released!") 
} 
# Error: Need to wait until package:stats 2.15 is released! 

这工作,因为packageVersion()返回package_version类的一个对象,其<的行为,因为我们希望它喜欢(这使用它们比较两个字符串时<不会做字典排序)。

11

在阅读Paul的伪代码后,下面是我写的函数。

use <- function(package, version=0, ...) { 
    package <- as.character(substitute(package)) 
    library(package, ..., character.only=TRUE) 
    pver <- packageVersion(package) 
    if (compareVersion(as.character(pver), as.character(version)) < 0) 
    stop("Version ", version, " of '", package, 
     "' required, but only ", pver, " is available") 
    invisible(pver) 
} 

它的功能基本相同,library(),但需要一个额外的version参数:

> use(plyr, 1.6) 
> use(ggplot2, '0.9') 
Error in use(ggplot2, "0.9") : 
    Version 0.9 of 'ggplot2' required, but only 0.8.9 is available