Требовать минимальную версию пакета R
Я только заметил, что нет аргумента version
для функций R
require()
или library()
. Что делают люди, когда им нужно обеспечить, чтобы они имели хотя бы некоторую минимальную версию пакета, так что, например, они знают, что исправлена ошибка, или какая-то функция доступна, или что-то еще?
Я знаю материал Depends
для авторов пакетов, но я ищу что-то для использования в скриптах, интерактивных средах, org-mode
файлах, фрагментах кода и т.д.
Ответы
Ответ 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