Требовать минимальную версию пакета R - PullRequest
19 голосов
/ 16 февраля 2012

Я только что заметил, что у R или library() функций нет аргумента version.Что делают люди, когда им нужно убедиться, что у них есть хотя бы какая-то минимальная версия пакета, чтобы, например, они знали, что какая-то ошибка исправлена, какая-то функция доступна или что-то еще?

Я знаюDepends материал для авторов пакетов, но я ищу что-то, что можно использовать в скриптах, интерактивных средах, org-mode файлах, фрагментах кода и т. д.

Ответы [ 3 ]

17 голосов
/ 16 февраля 2012

Вы можете использовать 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, для которого < ведет себя так, как нам хотелось бы (чего не будет < при сравнении двух строк символов с использованием их лексикографического порядка).

11 голосов
/ 16 февраля 2012

После прочтения псевдокода Пола вот функция, которую я написал.

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
7 голосов
/ 16 февраля 2012

Мне неизвестна такая функция, но ее довольно легко сделать.Вы можете основать это на 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 < min_version, но базовая структура остается прежней.

...