2012-02-16 2 views
19

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

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

ответ

7

Я не знаю о такой но это должно быть довольно легко сделать. Вы можете установить его на 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)) 
} 

Calling было бы как:

library(ggplot2) 
check_version("ggplot2", "0.8-9") 

Вы все еще должны проанализируйте номера версий во что-то, что позволяет сравнивать cur_version < min_version, но основная структура остается прежней.

+3

Спасибо. Похоже, что 'compareVersion()' правильная вещь для сравнения версий. –

+0

Удивительная функция там, пыталась что-то сделать сама, но это не было нужно :). –

+0

@ KenWilliams - Хороший улов. Я посмотрел на него и был отброшен с помощью инструкции справки о том, что «номера версии пакета R имеют форму« x.y-z ». Но на самом деле это выглядит как 'strsplit()' 'на' '-' 'и' ".", Так что детали не имеют значения. –

14

Вы можете использовать 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

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

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 
Смежные вопросы