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

Posted

技术标签:

【中文标题】r 检查包版本是不是大于 x.y.z【英文标题】:r check if package version is greater than x.y.zr 检查包版本是否大于 x.y.z 【发布时间】:2017-05-20 14:56:07 【问题描述】:

R 软件包的版本号类似于 1.97.1。我可以用

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

在我的电脑上返回 1.10.0。

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

【问题讨论】:

utils 包有一个compareVersion 函数。 或者甚至只是if(packageVersion("data.table") > "1.9.7") print("OK!\n") @Benjamin - 你应该这样回答。我以前从未听说过这个功能 - 看起来很有用。 @G5W - "1.10.0" > "1.9.8" 返回FALSE。而utils::compareVersion("1.10.0","1.9.8") 返回1 表示1.10.0 是更高版本 @thelatemail 我认为您正在进行字符串比较。对我来说,packageVersion("data.table") 给出“1.10.0”,packageVersion("data.table") > "1.9.8" 给出 true 【参考方案1】:

按照 Benjamin 的建议,正确的工具是 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 &lt; b 0 如果a == b 1 如果a &gt; b

来源:

?utils::compareVersion

【讨论】:

【参考方案2】:

虽然utils::compareVersion() 很好,但我想说将packageVersion() 与比较运算符一起使用(如cmets 中的@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 中明确记录了以这种方式使用比较运算符的能力:

函数numeric_versionpackage_versionR_system_version 从这些字符串创建一个表示(如果 合适的),它允许强制和测试,组合, 比较,摘要(最小/最大),包含在数据框中, 下标和打印。这些类可以包含这样的向量 表示。

【讨论】:

compareVersion() 不尊重precedence rules of semantic versioning。 "1.2.3.9000" 表示开发版本,而compareVersion("1.2.3.9000", "1.2.3")1。是否有遵循约定的预构建替代方案?【参考方案3】:

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

“package_version”和/或“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"))

【讨论】:

以上是关于r 检查包版本是不是大于 x.y.z的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 MySQL 中的版本字符串(“x.y.z”)?

检查最新的 npm 包版本是不是具有相同的主要版本

R CMD 检查:全局变量没有可见绑定(使用包中的数据/数据集时)

R:检查“今天的”文件是不是存在,如果不存在,请下载

检查要求是不是是最新的

检查当前循环迭代是不是大于前一个