Buenas tardes para todos, Me gustaría automatizar la descarga de librerias cuando ejecuto una función que estoy por terminar. Supongamos que la función se llama foo y require las librerias A y B. Una manera fácil de cargar las librerias dentro de foo es: foo <- function(argumentos){ require(A) require(B) # hacer transformaciones, cálculos y gráficos aquí } Por supuesto, require() hace su trabajo si y solo si A y B han sido descargadas previamente. Si no es así, el usuario tendría que descargarlas (lo cual NO me gustaría) via los métodos ya conocidos. Lo que quisiera hacer, dentro de foo (y agradezco de antemano cualquier sugerencia), es chequear si una libreria en particular ya ha sido descargada. Si esto no lo ha sido, entonces que R la descargue automáticamente y la cargue en el espacio de trabajo para luego ejecutar el resto de las cosas dentro de foo. Con ello quiero "ahorrarle" el proceso de búsqueda y descarga al usuario. En lenguaje R sería algo como: if( A está instalada ) require(A) else "descargarla automáticamente" El problema es que no sé cómo preguntar si "A está instalada". El resto es "fácil" de hacer. Estoy trabajando con R 2.9.0 Pactched en Windows XP. Muchas gracias por su ayuda, Jorge Ivan Velez [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2009-May-21 23:40 UTC
[R-es] Cómo descargar librerías automáticamente?
Hola, ¿qué tal? Lo que puedes hacer es utilizar "installed.packages" para obtener una lista de los paquetes instalados. Si el que necesitas no es uno de ellos, usa "install.packages". De todos modos, ése es un procedimiento "primitivo" y sin garantía universal de éxito. Por ejemplo, en Linux, deberías poder ser administrador para que R te dejase instalar un paquete (vale, lo sé, esto sólo es cierto al 50%). No sé cuál es la situación en ese otro sistema operativo que usa tanta gente... La manera más robusta de lograr tu objetivo es crear paquetes con las funciones que vayas a utilizar. Puedes entonces establecer las dependencias de tus paquetes de antemano, de manera que éstos se instalen recursivamente. Crear paquetes puede, al principio, parecer un proceso pesado pero uno se acaba acostumbrando (yo, en dos semanas, he creado cuatro) y, además, adquiere, aunque sea a las malas, el sano hábito de documentar el código. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com On Thu, 2009-05-21 at 16:03 -0400, Jorge Ivan Velez wrote:> Buenas tardes para todos, > Me gustara automatizar la descarga de librerias cuando ejecuto una funcin > que estoy por terminar. Supongamos que la funcin se llama foo y require las > librerias A y B. Una manera fcil de cargar las librerias dentro de foo es: > > foo <- function(argumentos){ > require(A) > require(B) > # hacer transformaciones, clculos y grficos aqu > } > > Por supuesto, require() hace su trabajo si y solo si A y B han sido > descargadas previamente. Si no es as, el usuario tendra que descargarlas > (lo cual NO me gustara) via los mtodos ya conocidos. > > Lo que quisiera hacer, dentro de foo (y agradezco de antemano cualquier > sugerencia), es chequear si una libreria en particular ya ha sido > descargada. Si esto no lo ha sido, entonces que R la descargue > automticamente y la cargue en el espacio de trabajo para luego ejecutar el > resto de las cosas dentro de foo. Con ello quiero "ahorrarle" el proceso de > bsqueda y descarga al usuario. > > En lenguaje R sera algo como: > > if( A est instalada ) require(A) else "descargarla > automticamente" > > El problema es que no s cmo preguntar si "A est instalada". El resto es > "fcil" de hacer. > > Estoy trabajando con R 2.9.0 Pactched en Windows XP. > > Muchas gracias por su ayuda, > > Jorge Ivan Velez > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Muchas gracias a Manuel Muñoz Márquez (Proyecto R UCA), Luis Mariano Esteban (Universidad de Zaragoza) y Carlos J. Gil Bellosta (Data Analytics) por sus valiosos comentarios. Tomando como base el script al que Manuel me refirió (ver [1]), esta es la solución que implementé: # Función para descargar automáticamente las librerias que se # requiren pero NO están instaladas. Por defecto (argumento url) se # buscan en los repositorios del CRAN pero podría ser Omegahat getPkg <- function(pkg, url = "http://cran.r-project.org") { to.do <- setdiff(pkg, installed.packages()[,1]) for(package in to.do) invisible(install.packages(package, repos = url)) } Por supuesto, otras sugerencias y/o comentarios acerca de cómo mejorarlo, SON bienvenidos :) # Ejemplo: chequeando la libreria fBasics options(warn=-1, width=100) # Para eliminar los warnings getPkg(''fBasics'') require(fBasics, quietly = TRUE) Una vez descargada, podemos intentarlo de nuevo y no se obtiene resultado alguno (como era de esperarse): getPkg(''fBasics'') # no pasa nada :) Ahora, si se requieren mas de dos librerias (del mismo repositorio), entonces el argumento de getPkg debe ser un vector que contiene el nombre de las librerias necesarias. Por ejemplo si se requiren las librerias RODBC, AMORE y multtest, entonces: # Vector de librerias pkgs <- c(''RODBC'',''AMORE'',''multtest'') getPkg(pkgs) Gracias de nuevo, Jorge Ivan Velez [1] http://knuth.uca.es/repos/R-contribuciones/r-uca/r-uca-w/install.R> > > > On Thu, 2009-05-21 at 16:03 -0400, Jorge Ivan Velez wrote: > > Buenas tardes para todos, > > Me gustara automatizar la descarga de librerias cuando ejecuto una funcin > > que estoy por terminar. Supongamos que la funcin se llama foo y require > las > > librerias A y B. Una manera fcil de cargar las librerias dentro de foo > es: > > > > foo <- function(argumentos){ > > require(A) > > require(B) > > # hacer transformaciones, clculos y grficos aqu > > } > > > > Por supuesto, require() hace su trabajo si y solo si A y B han sido > > descargadas previamente. Si no es as, el usuario tendra que descargarlas > > (lo cual NO me gustara) via los mtodos ya conocidos. > > > > Lo que quisiera hacer, dentro de foo (y agradezco de antemano cualquier > > sugerencia), es chequear si una libreria en particular ya ha sido > > descargada. Si esto no lo ha sido, entonces que R la descargue > > automticamente y la cargue en el espacio de trabajo para luego ejecutar > el > > resto de las cosas dentro de foo. Con ello quiero "ahorrarle" el proceso > de > > bsqueda y descarga al usuario. > > > > En lenguaje R sera algo como: > > > > if( A est instalada ) require(A) else "descargarla > > automticamente" > > > > El problema es que no s cmo preguntar si "A est instalada". El resto es > > "fcil" de hacer. > > > > Estoy trabajando con R 2.9.0 Pactched en Windows XP. > > > > Muchas gracias por su ayuda, > > > > Jorge Ivan Velez > > > > [[alternative HTML version deleted]] > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]