需要最低版本的R包

Ken*_*ams 20 packages r version

我只注意到有没有version参数Rrequire()library()功能.当人们需要确保他们至少拥有一个包的最低版本时,人们会做什么,以便例如他们知道某些错误是固定的,或某些功能是否可用,或者其他什么?

我知道Depends包作者的东西,但我正在寻找在脚本,交互式环境,org-mode文件,代码片段等中使用的东西.

Jos*_*ien 17

你可以使用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!
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为packageVersion()返回一个类的对象,package_version<行为与我们所希望的一样(<当使用它们的词典排序比较两个字符串时不会这样做).


Ken*_*ams 11

在阅读了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)
}
Run Code Online (Sandbox Code Playgroud)

它的功能基本相同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
Run Code Online (Sandbox Code Playgroud)


Pau*_*tra 8

我不知道这样的功能,但它应该很容易制作一个.你可以将它建立在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))
}
Run Code Online (Sandbox Code Playgroud)

打电话就像:

library(ggplot2)
check_version("ggplot2", "0.8-9")
Run Code Online (Sandbox Code Playgroud)

您仍然需要将版本号解析为允许比较的内容cur_version < min_version,但基本结构保持不变.

  • 谢谢.看起来`compareVersion()`是用于版本比较的正确选择. (3认同)