Подтвердить что ты не робот

Требовать минимальную версию пакета R

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

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

4b9b3361

Ответ 1

Я не знаю о такой функции, но ее должно быть довольно легко сделать. Вы можете установить его на sessionInfo() или packageVersion(). После загрузки пакетов, необходимых для script, вы можете собирать номера пакетов оттуда. Функция, которая проверяет номер версии, будет выглядеть (в псевдокоде, поскольку у меня нет времени прямо сейчас):

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, но базовая структура остается прежней.

Ответ 2

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

Ответ 3

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

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