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 < b
0
如果a == b
1
如果a > 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_version
、package_version
和R_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_version
和package_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的主要内容,如果未能解决你的问题,请参考以下文章