我刚刚注意到的require()
或library()
函数没有version
的参数。当人们需要确保他们至少有一些最低版本的软件包时,他们做了什么,例如他们知道一些错误是固定的,或者某些功能可用,或者其他什么?需要R包的最低版本
我知道的东西Depends
对于包的作者,但我正在寻找的东西在脚本中,互动的环境,org-mode
文件,代码片段用等
我刚刚注意到的require()
或library()
函数没有version
的参数。当人们需要确保他们至少有一些最低版本的软件包时,他们做了什么,例如他们知道一些错误是固定的,或者某些功能可用,或者其他什么?需要R包的最低版本
我知道的东西Depends
对于包的作者,但我正在寻找的东西在脚本中,互动的环境,org-mode
文件,代码片段用等
我不知道这样的功能,但制作一个应该很容易。您可以将其基于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
,但基本结构保持不变。
你可以使用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
类的一个对象,其<
的行为,因为我们希望它喜欢(这使用它们比较两个字符串时<
不会做字典排序)。
在阅读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
感谢。看起来像'compareVersion()'是用于版本比较的正确选择。 – 2012-02-16 18:16:13
真棒那功能在那里,试图自己做一些东西,但那不需要:)。 – 2012-02-16 18:23:40
@KenWilliams - 很好。我看了一下,并且在帮助页面的声明中被抛出轨道:“R软件包版本号的形式为'x.y-z'”。但它在实际上看起来像在'' - “'和'”。“''上都是strsplit(),所以细节并不重要。 – 2012-02-16 20:58:31