【发布时间】:2012-02-16 16:12:51
【问题描述】:
我刚刚注意到R 的require() 或library() 函数没有version 参数。人们在需要确保他们至少拥有某个软件包的最低版本时会做什么,例如他们知道某些错误已修复,或某些功能可用,或其他什么?
我知道 Depends 包作者的东西,但我正在寻找可以在脚本、交互式环境、org-mode 文件、代码 sn-ps 等中使用的东西。
【问题讨论】:
我刚刚注意到R 的require() 或library() 函数没有version 参数。人们在需要确保他们至少拥有某个软件包的最低版本时会做什么,例如他们知道某些错误已修复,或某些功能可用,或其他什么?
我知道 Depends 包作者的东西,但我正在寻找可以在脚本、交互式环境、org-mode 文件、代码 sn-ps 等中使用的东西。
【问题讨论】:
你可以使用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
【讨论】:
我不知道有这样的功能,但它应该很容易制作。您可以基于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,但基本结构保持不变。
【讨论】:
compareVersion() 适合用于版本比较。
"-" 和"." 上看起来就像strsplit()s,所以细节并不重要。
package_version 的文档说:“数字版本是一个或多个非负整数的序列,通常(例如,在包'DESCRIPTION'文件中)表示为字符序列元素由单个 . 或 - 字符连接和分隔的字符串。R 包版本 至少包含两个这样的整数,R 系统版本正好是三个(主要、次要和补丁级别)。 "