【问题标题】:Require minimum version of R package需要最低版本的 R 包
【发布时间】:2012-02-16 16:12:51
【问题描述】:

我刚刚注意到Rrequire()library() 函数没有version 参数。人们在需要确保他们至少拥有某个软件包的最低版本时会做什么,例如他们知道某些错误已修复,或某些功能可用,或其他什么?

我知道 Depends 包作者的东西,但我正在寻找可以在脚本、交互式环境、org-mode 文件、代码 sn-ps 等中使用的东西。

【问题讨论】:

    标签: r version packages


    【解决方案1】:

    你可以使用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 类的对象,&lt; 的行为与我们希望的一样(&lt; 在使用它们的字典顺序比较两个字符串时不会这样做)。

    【讨论】:

      【解决方案2】:

      阅读 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
      

      【讨论】:

        【解决方案3】:

        我不知道有这样的功能,但它应该很容易制作。您可以基于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 &lt; min_version,但基本结构保持不变。

        【讨论】:

        • 谢谢。看起来compareVersion() 适合用于版本比较。
        • 那里有很棒的功能,尝试自己制作一些东西,但不需要:)。
        • @KenWilliams -- 不错的收获。我看了看它,并被它的帮助页面声明“R 包版本号的形式为‘x.y-z’”而偏离了轨道。但实际上它在"-""." 上看起来就像strsplit()s,所以细节并不重要。
        • 有点隐蔽,但package_version 的文档说:“数字版本是一个或多个非负整数的序列,通常(例如,在包'DESCRIPTION'文件中)表示为字符序列元素由单个 . 或 - 字符连接和分隔的字符串。R 包版本 至少包含两个这样的整数,R 系统版本正好是三个(主要、次要和补丁级别)。 "
        猜你喜欢
        • 2018-02-27
        • 2018-09-12
        • 2021-01-17
        • 1970-01-01
        • 2022-12-14
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        相关资源
        最近更新 更多