r 检查包版本是否大于 x.y.z

r check if package version is greater than x.y.z

R 包的版本号如 1.97.1。我可以用

检查版本号
 packageVersion("data.table")

在我的电脑上这个 returns 1.10.0.

我想做的是检查 data.table 版本是否比 1.9.7 更新,因为 1.9.7 之后的版本具有我的代码需要的功能。我试过将版本拆分成它的组成部分并以不同的方式评估它们,但我还没有想出任何可靠的方法来做到这一点。 非常感谢任何建议。

正如本杰明所建议的,正确的工具是 compareVersion:

version_above <- function(pkg, than) {
  as.logical(compareVersion(as.character(packageVersion(pkg)), than))
}

packageVersion("ggplot2")
# [1] '2.2.1'
version_above("ggplot2", "2.0.0")
# [1] TRUE
version_above("ggplot2", "3.0.0")
# [1] FALSE

compareVersion(a, b) 的结果是

  • -1 如果 a < b
  • 0 如果 a == b
  • 1 如果 a > b

来源:

?utils::compareVersion

虽然 utils::compareVersion() 很好,但我会说使用 packageVersion() 和比较运算符(如评论中的@G5W 所示)更简单:

packageVersion("data.table")
[1] ‘1.10.0’
> packageVersion("data.table")>"1.9.8"
[1] TRUE
> packageVersion("data.table")>"1.10.01"
[1] FALSE
> packageVersion("data.table")=="1.10.0"
[1] TRUE

这在 ?packageVersion 的示例中有所说明; ?package_version:

中明确记录了以这种方式使用比较运算符的能力

Functions numeric_version, package_version and R_system_version create a representation from such strings (if suitable) which allows for coercion and testing, combination, comparison, summaries (min/max), inclusion in data frames, subscripting, and printing. The classes can hold a vector of such representations.

如何使用包版本的小指南。

"package_version" and/or "numeric_version" 类 用于表示包版本。 (class(packageVersion("base"))).
我们也可以使用 numeric_version/as.numeric_version 函数进行转换。

numeric_versionpackage_version 函数(或与它们相关的 类 )有什么区别。 几乎没有区别。两者都是 .make_numeric_version 函数的包装器,后者有一种直接使用 R.version.

的额外用法
v1 <- structure(list(c(1L, 10L, 1L)), class = "numeric_version")
# or numeric_version("1.10.1")
v2 <- `class<-`(list(c(1L, 9L, 8L)), class = "numeric_version")

v1 > v2
# This will still work as the numeric_version has a priority under the `>` operator 
# so the simple character is converted to numeric_version.
v1 > "1.9.8"
"1.10.1" > v2
# direct comparison for characters will fail
"1.10.1" > "1.9.8"

# comparing with utils::compareVersion
compareVersion("1.10.1", "1.9.8")
# comparing versions vector with pacs::compareVersionsMax or pacs::compareVersionsMin
pacs::compareVersionsMax(c("1.1.1", "1.0.0", "3.3.3"))