【问题标题】: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

标签: r package version


【解决方案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"))
    

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2019-02-20
      • 2014-01-15
      相关资源
      最近更新 更多