2012-02-16 10 views
19

Ho appena notato che non esiste l'argomento version per le funzioni o library(). Cosa fanno le persone quando hanno bisogno di assicurarsi di avere almeno una versione minima di un pacchetto, così ad es. sanno che alcuni bug sono corretti, o alcune funzionalità sono disponibili, o altro?Richiedere la versione minima del pacchetto R

Sono consapevole delle cose Depends per gli autori del pacchetto, ma sto cercando qualcosa da usare negli script, ambienti interattivi, org-mode file, frammenti di codice, ecc

risposta

7

io non sono a conoscenza di una tale funzione, ma dovrebbe essere abbastanza facile crearne uno. Puoi basarlo su sessionInfo() o packageVersion(). Dopo aver caricato i pacchetti richiesti per lo script, è possibile raccogliere i numeri di pacchetto da lì. Una funzione che controlla il numero di versione sarà simile (in pseudo codice, come io non ho tempo adesso):

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 sarebbe come:

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

è ancora necessario analizzare i numeri di versione in qualcosa che consente il confronto cur_version < min_version, ma la struttura di base rimane la stessa.

+3

Grazie. Sembra che 'compareVersion()' è la cosa giusta da usare per il confronto delle versioni. –

+0

Impressionante quella funzione era lì, ho provato a creare qualcosa da solo, ma non era necessario :). –

+0

@KenWilliams - Bella presa. Ho dato un'occhiata a questo, e sono stato buttato fuori strada dalla sua dichiarazione della pagina di aiuto che "i numeri di versione del pacchetto R sono del tipo 'x.y-z'". Ma sembra che in realtà 'strsplit()' s su entrambi '" - "' e '". "', In modo che il dettaglio non abbia importanza. –

14

Si potrebbe utilizzare 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! 

Questo funziona perché packageVersion() restituisce un oggetto della classe package_version per i quali < si comporta come vorremmo a (che < non va bene quando si confrontano due stringhe di caratteri utilizzando il loro ordinamento lessicografico).

11

Dopo aver letto lo pseudocodice di Paul, ecco la funzione che ho scritto.

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

funziona fondamentalmente lo stesso come library(), ma prende un extra version argomento:

> 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