2012-02-16 24 views
19

Właśnie zauważyłem, że nie ma argumentu version dla funkcji R 'require() lub library(). Co robią ludzie, gdy muszą upewnić się, że mają przynajmniej minimalną wersję pakietu, np. wiedzą, że jakiś błąd jest naprawiony, albo jakaś funkcja jest dostępna, czy coś w tym stylu?Wymagaj minimalnej wersji pakietu R

Jestem świadomy Depends rzeczy dla autorów pakietu, ale szukam czegoś do wykorzystania w skryptach, środowisk interaktywnych, org-mode plików, fragmenty kodu, itp

Odpowiedz

7

nie jestem świadomy takiego funkcja, ale powinno być całkiem łatwe do zrobienia. Możesz go oprzeć na sessionInfo() lub packageVersion(). Po załadowaniu pakietów wymaganych do skryptu, możesz pobrać numery paczek z tego miejsca. Funkcja, która sprawdza numer wersji będzie wyglądać (w pseudo kod, a nie mam teraz czasu):

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)) 
} 

Wywołanie byłoby jak:

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

Trzeba jeszcze przeanalizuj numery wersji w coś, co pozwala na porównanie cur_version < min_version, ale podstawowa struktura pozostaje taka sama.

+3

dzięki. Wygląda na to, że porównanie "porównania"() jest właściwym rozwiązaniem. –

+0

Niesamowite, że funkcja tam była, próbowałem zrobić coś samemu, ale to nie było potrzebne :). –

+0

@KenWilliams - Nice catch. Rzuciłem okiem na to i zostałem zignorowany przez oświadczenie na stronie pomocy, że "numery wersji pakietu R mają postać" x.y-z "". Ale wygląda na to, że 'strsplit()' '' '' '' 'występuje zarówno na" "-" ", jak i" ".", Więc szczegóły nie mają znaczenia. –

14

Można użyć 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! 

To działa, ponieważ packageVersion() zwraca obiekt klasy package_version dla których < zachowuje się jak chcielibyśmy go (co < nie zrobi przy porównywaniu dwóch ciągów znaków przy użyciu ich uporządkowanie leksykograficzne).

11

Po przeczytaniu pseudokodu Paula, oto funkcja, którą napisałem.

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) 
} 

Funkcjonuje on w zasadzie taki sam jak library(), ale bierze dodatkowy version argument:

> 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 
Powiązane problemy