2012-02-16 26 views
19

Me acabo de dar cuenta de que no hay argumento version para R 's require() o library() funciones. ¿Qué hacen las personas cuando necesitan asegurarse de tener al menos una versión mínima de un paquete, de modo que, p. saben que se corrigió algún error, o alguna característica está disponible, o lo que sea?Requerir la versión mínima del paquete R

Soy consciente de las cosas Depends para los autores del paquete, pero yo estoy buscando algo para usar en los scripts, entornos interactivos, org-mode archivos, fragmentos de código, etc.

Respuesta

7

No estoy al tanto de tal función, pero debería ser bastante fácil de hacer uno. Puede basarlo en sessionInfo() o packageVersion(). Después de cargar los paquetes requeridos para el script, puede cosechar los números del paquete desde allí. Una función que comprueba el número de versión se vería así (en pseudo código, ya que no tengo tiempo ahora):

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

llamándolo sería como:

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

Todavía es necesario analizar los números de versión en algo que permite la comparación cur_version < min_version, pero la estructura básica sigue siendo la misma.

+3

Gracias. Parece que 'compareVersion()' es lo correcto para usar para la comparación de versiones. –

+0

Impresionante esa función estaba allí, intenté hacer algo yo mismo, pero eso no era necesario :). –

+0

@KenWilliams - Buena captura. Lo eché un vistazo y me desvió de su declaración de la página de ayuda que dice que "los números de versión del paquete R son de la forma 'x.y-z'". Pero parece que en realidad es 'strsplit()' s en los dos '" - "' y '". "', Por lo que los detalles no importan. –

14

Usted podría utilizar 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! 

Esto funciona porque packageVersion() devuelve un objeto de la clase para la que package_version< se comporta como nos gustaría que (que < no va a hacer cuando se comparan dos cadenas de caracteres utilizando su ordenamiento lexicográfico).

11

Después de leer el pseudocódigo de Paul, aquí está la función que he escrito.

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

It funciones básicamente el mismo que library(), pero toma un argumento extra 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 
Cuestiones relacionadas