Parece que estoy compartiendo mucho código con los coautores en estos días. Muchos de ellos son usuarios novatos / intermedios de R y no se dan cuenta de que tienen que instalar paquetes que ya no tienen.
¿Hay una manera elegante de llamar installed.packages()
, compararla con las que estoy cargando e instalar si falta?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
... ;-)Respuestas:
Si. Si tiene su lista de paquetes, compárela con el resultado
installed.packages()[,"Package"]
e instale los paquetes que faltan. Algo como esto:De otra manera:
Si coloca su código en un paquete y las convierte en dependencias, se instalarán automáticamente cuando instale su paquete.
fuente
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
lugar de verificarinstalled.packages
packrat
fue hecho para esto. Es un sistema de gestión de paquetes reproducible. De esta manera, está yendo por el camino equivocado y se mete con el entorno de otra persona y no es reproducible. Packrat tiene su propia carpeta y entorno para las bibliotecas compartidas. rstudio.github.io/packratDason K. y yo tenemos el paquete pacman que puede hacer esto bien. La función
p_load
en el paquete hace esto. La primera línea es solo para garantizar que pacman esté instalado.fuente
/
y, si se encuentra, instale / cargue automáticamente desde github.if (!require("pacman")) install.packages("pacman")
hay una función en pacman llamadap_boot()
que hace que esta línea sea automática para usted y la copia al portapapeles.Puede usar el valor de retorno de
require
:Lo uso
library
después de la instalación porque arrojará una excepción si la instalación no fue exitosa o el paquete no se puede cargar por alguna otra razón. Lo haces más robusto y reutilizable:La desventaja de este método es que debe pasar el nombre del paquete entre comillas, lo que no hace de verdad
require
.fuente
character.only = TRUE
derequire
, pero entonces creo que no hay nada para diferenciar su respuesta a la mía."ggplot2" es el paquete. Comprueba si el paquete está instalado, si no lo está, lo instala. Luego carga el paquete independientemente de la rama que tomó.
fuente
Esta solución tomará un vector de caracteres de los nombres de los paquetes e intentará cargarlos o instalarlos si falla la carga. Se basa en el comportamiento de retorno de
require
hacer esto porque ...Por lo tanto, simplemente podemos ver si pudimos cargar el paquete requerido y, de lo contrario, instalarlo con dependencias. Entonces, dado un vector de caracteres de los paquetes que desea cargar ...
fuente
require
después de la instalación?if
declaración se evalúe primero debe evaluarrequire
, ¡cuyo efecto secundario es cargar el paquete si está disponible!install.packages
, ya que esto realmente no cargaría ese paquete. Pero (a @krlmlr) sospecho que la intención es que este fragmento de código solo se llame una vez; no escribirías esto cada vez que requieras el paquete. En su lugar, lo ejecutaría una vez antes y luego llamaría de larequire
forma habitual, según sea necesario.require
llamar al segundolibrary
para que falle ruidosamente si aún no puede adjuntar el paquete por alguna razón?Muchas de las respuestas anteriores (y en duplicados de esta pregunta) dependen de
installed.packages
cuál es una mala forma. De la documentación:Por lo tanto, un mejor enfoque es intentar cargar el paquete usando
require
e instalarlo si falla la carga (require
volveráFALSE
si no se encuentra). Prefiero esta implementación:que se puede usar así:
De esta manera, carga todos los paquetes, luego regresa e instala todos los paquetes que faltan (que si lo desea, es un lugar útil para insertar un mensaje para preguntar si el usuario desea instalar paquetes). En lugar de llamar
install.packages
por separado para cada paquete, pasa el vector completo de los paquetes desinstalados solo una vez.Aquí está la misma función pero con un cuadro de diálogo de Windows que pregunta si el usuario desea instalar los paquetes faltantes
fuente
Aunque la respuesta de Shane es realmente buena, para uno de mis proyectos necesitaba eliminar los mensajes de salida, advertencias e instalar paquetes automáticamente . Finalmente logré obtener este script:
Utilizar:
fuente
fuente
Este es el propósito del paquete rbundler : proporcionar una forma de controlar los paquetes que están instalados para un proyecto específico. En este momento, el paquete funciona con la funcionalidad devtools para instalar paquetes en el directorio de su proyecto. La funcionalidad es similar al paquete de Ruby .
Si su proyecto es un paquete (recomendado), todo lo que tiene que hacer es cargar rbundler y agrupar los paquetes. La
bundle
función mirará elDESCRIPTION
archivo de su paquete para determinar qué paquetes agrupar.Ahora los paquetes se instalarán en el directorio .Rbundle.
Si su proyecto no es un paquete, puede simularlo creando un
DESCRIPTION
archivo en el directorio raíz de su proyecto con un campo Depende que enumere los paquetes que desea instalar (con información de versión opcional):Aquí está el repositorio de github para el proyecto si está interesado en contribuir: rbundler .
fuente
Por supuesto.
Necesita comparar 'paquetes instalados' con 'paquetes deseados'. Eso está muy cerca de lo que hago con CRANberries, ya que necesito comparar 'paquetes conocidos almacenados' con 'paquetes conocidos actualmente' para determinar paquetes nuevos y / o actualizados.
Entonces haz algo como
para obtener todos los paquetes conocidos, llame de forma simulada a los paquetes instalados actualmente y compárelos con un conjunto dado de paquetes de destino.
fuente
Úselo
packrat
para que las bibliotecas compartidas sean exactamente iguales y no cambien el entorno de los demás.En términos de elegancia y mejores prácticas, creo que básicamente lo estás haciendo mal. El paquete
packrat
fue diseñado para estos problemas. Está desarrollado por RStudio por Hadley Wickham. En lugar de tener que instalar dependencias y posiblemente estropear el sistema de entorno de alguien,packrat
usa su propio directorio e instala todas las dependencias para sus programas allí y no toca el entorno de alguien.https://rstudio.github.io/packrat/
fuente
La siguiente función simple funciona como un encanto:
(no el mío, encontré esto en la web hace algún tiempo y lo había estado usando desde entonces. No estoy seguro de la fuente original)
fuente
Uso la siguiente función para instalar el paquete si
require("<package>")
sale con un error de paquete no encontrado. Consultará los repositorios CRAN y Bioconductor para el paquete faltante.Adaptado del trabajo original de Joshua Wiley, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
Ejemplo:
PD:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
actualizará todos los paquetes instalados en el sistema. ¡Esto puede llevar mucho tiempo y considerarlo como una actualización completa de R que puede no estar garantizada todo el tiempo!fuente
loadpack()
en raw.githubusercontent.com/holgerbrandl/datautils/master/R/...Simplemente puede usar la
setdiff
función para obtener los paquetes que no están instalados y luego instalarlos. En el ejemplo a continuación, verificamos si los paquetesggplot2
yRcpp
están instalados antes de instalarlos.En una línea, lo anterior se puede escribir como:
fuente
installed.packages()[,'Package']
lugar derownames(installed.packages())
.He implementado la función para instalar y cargar los paquetes R necesarios de forma silenciosa. La esperanza podría ayudar. Aquí está el código:
fuente
La próxima versión de RStudio (1.2), ya disponible como vista previa, incluirá una función para detectar paquetes faltantes
library()
yrequire()
llamadas, y solicitará al usuario que los instale:Esto parece abordar la preocupación original de OP particularmente bien:
fuente
Con respecto a su objetivo principal "instalar bibliotecas que aún no tienen" e independientemente del uso de "instllaed.packages ()". La siguiente función enmascara la función original de require. Intenta cargar y verificar el paquete con nombre "x"; si no está instalado, instálelo directamente, incluidas las dependencias; y por último cargarlo normalmente. cambia el nombre de la función de 'require' a 'library' para mantener la integridad. La única limitación es que se deben citar los nombres de los paquetes.
Por lo tanto, puede cargar e instalar el paquete a la antigua usanza de R. require ("ggplot2") require ("Rcpp")
fuente
delete
enlace sobre estos comentarios. Si no lo hace, y aún desea eliminar, use elflag
enlace, seleccione "otro" y explique a un moderador que desea que se elimine la respuesta.Bastante básico.
fuente
Pensé que contribuiría con el que uso:
fuente
fuente
Usando el enfoque de familia anónima y función anónima, usted puede:
||
evaluación perezosa).Imprima el estado de carga final de cada paquete (
TRUE
/FALSE
).fuente
Utilizo lo siguiente que verificará si el paquete está instalado y si las dependencias se actualizan, luego carga el paquete.
fuente
Aquí está mi código para ello:
fuente
fuente
Esto funciona con nombres de paquetes sin comillas y es bastante elegante (véase la respuesta de GeoObserver)
fuente
En mi caso, quería un trazador de líneas que pudiera ejecutar desde la línea de comandos (en realidad a través de un Makefile). Aquí hay un ejemplo de instalación de "VGAM" y "pluma" si aún no están instalados:
Desde dentro de R solo sería:
Aquí no hay nada más allá de las soluciones anteriores, excepto que:
repos
parámetro (para evitar cualquier ventana emergente que pregunte sobre el espejo para usar)También tenga en cuenta lo importante
character.only=TRUE
(sin él,require
intentaría cargar el paquetep
).fuente
fuente
Déjame compartir un poco de locura:
fuente