Capítulo2 Instalación de paquetes
Fecha de la última revisión
## [1] "2026-09-09"
2.1 ¿Por qué esta página?
A lo largo del libro usamos muchos paquetes de R. Un paquete es una colección de funciones, datos y documentación que amplía lo que R puede hacer. Antes de comenzar conviene instalar de una sola vez todos los paquetes que vamos a necesitar, para que ningún capítulo falle por un paquete que falta.
Esta página parece la menos interesante del libro y es, sin embargo, la que más
tiempo te va a ahorrar. Casi todos los mensajes de error que reciben los
estudiantes en las primeras tres semanas del curso no son errores de análisis:
son paquetes que no están instalados, paquetes instalados pero no activados, o
dos paquetes que tienen una función con el mismo nombre y se pisan uno al otro.
Si entiendes bien las cuatro ideas de este capítulo (instalar, activar, llamar
con ::, y resolver conflictos), te vas a ahorrar muchas horas de frustración.
CRAN (Comprehensive R Archive Network), la red oficial de paquetes de R, funciona desde 1997 y hoy alberga más de 20,000 paquetes. El tidyverse, una colección de paquetes con una filosofía común para la ciencia de datos, fue creado por Hadley Wickham y su equipo en RStudio (hoy Posit); el nombre se popularizó alrededor de 2016.
2.2 Qué es un paquete y dónde vive
Cuando abres R, lo que tienes disponible es el R base: unas pocas cientos de
funciones (mean(), length(), plot(), read.csv()) que vienen con el
programa. Todo lo demás lo aportan los paquetes. Un paquete no es más que una
carpeta con código de R, documentación y, muchas veces, conjuntos de datos de
ejemplo, empaquetada de forma que R la pueda leer.
Esa carpeta se guarda en tu computadora, en un lugar que R llama la
biblioteca (library). Puedes ver dónde está con .libPaths(). Cuando
corres install.packages("dplyr"), R se conecta a CRAN, descarga el paquete y
lo copia en esa carpeta. Ahí se queda para siempre, aunque cierres R, aunque
apagues la computadora. Por eso instalar es algo que se hace una vez.
Activar es otra cosa. Cuando corres library(dplyr), R va a la biblioteca,
busca la carpeta de dplyr y pone sus funciones a tu disposición en la sesión
que está corriendo en ese momento. Al cerrar R, esa sesión desaparece. La
próxima vez que abras R el paquete sigue instalado, pero no está activado, y
tienes que volver a correr library().
La comparación que suele funcionar en clase: instalar un paquete es como comprar
un libro y ponerlo en el estante de tu casa. Activarlo con library() es bajar
ese libro del estante y abrirlo sobre la mesa. El libro no deja de ser tuyo
cuando lo devuelves al estante, pero si no lo bajas, no puedes leerlo.
Recuerda: solo hay que instalar un paquete una vez en la computadora (con
install.packages()), pero hay que activarlo con library() en cada sesión
en la que lo vayas a usar.
install.packages("paquete") y library(paquete): instalar vs. activar.
install.packages("x"): descarga e instala el paquete desde internet (CRAN). Se hace una sola vez por computadora. El nombre va entre comillas, porque cuando escribes la línea el paquete todavía no existe en tu máquina y R no puede reconocerlo como un objeto.library(x): carga el paquete en la sesión actual para poder usar sus funciones. Se hace en cada sesión. Aquí el nombre va sin comillas (aunque con comillas también funciona), porque el paquete ya está instalado.dependencies = TRUE: instala también los paquetes de los que este depende. Casi siempre lo quieres puesto.- Regla de oro: instalar = una vez; activar con
library()= cada vez que abres R.
Un error muy frecuente es instalar el paquete pero olvidar activarlo en la sesión. Si al usar una función aparece could not find function, casi siempre falta correr library(). Encontrarás más errores frecuentes y cómo resolverlos en el capítulo Errores comunes (14).
Un .Rmd no hereda los paquetes de tu consola. Cuando le das a Knit,
RStudio abre una sesión de R nueva y limpia. Si activaste tidyverse en la
consola pero no escribiste library(tidyverse) dentro del documento, el
documento no va a compilar, aunque en la consola todo te funcione. Por eso todos
los capítulos de este libro empiezan con su bloque de library().
2.3 Instalar todos los paquetes del libro
Copia y ejecuta el siguiente bloque una sola vez en la consola de RStudio. El script revisa cuáles paquetes ya están instalados e instala solamente los que falten. Instala cada paquete por separado, de modo que si alguno no se puede instalar, los demás sí se instalan y al final se te informa cuáles fallaron.
Instalar paquetes descarga archivos desde CRAN, así que necesitas conexión a internet. En una red lenta el proceso puede tardar varios minutos.
paquetes_curso <- c(
# --- Núcleo: tidyverse y datos en español ---
"tidyverse", "datos", "ggversa",
"dplyr", "tidyr", "readr", "purrr", "stringr", "forcats",
"ggplot2", "lubridate", "magrittr",
# --- Datos de ejemplo ---
"nycflights13", "babynames", "nasaweather", "fueleconomy", "Lahman",
# --- Importar / limpiar / tablas ---
"readxl", "haven", "data.table", "hms", "zoo",
"gt", "flextable", "knitr", "bookdown", "gridExtra",
# --- Modelos y estadística ---
"modelr", "broom", "tidymodels", "MASS", "DescTools",
"GMCM", "TidyDensity",
# --- Mapas y visualización ---
"leaflet", "maps", "RColorBrewer",
# --- Hex stickers e imágenes ---
"hexSticker", "showtext", "sysfonts", "magick",
# --- Nubes de palabras / texto ---
"wordcloud", "wordcloud2", "tm", "SnowballC", "stopwords",
# --- Utilidades y datos externos ---
"pacman", "devtools", "rinat", "cranlogs", "packageRank"
)
faltantes <- setdiff(paquetes_curso, rownames(installed.packages()))
fallidos <- character(0)
for (p in faltantes) {
ok <- tryCatch({
install.packages(p, dependencies = TRUE)
TRUE
}, error = function(e) FALSE, warning = function(w) FALSE)
if (!ok || !(p %in% rownames(installed.packages()))) fallidos <- c(fallidos, p)
}
if (length(fallidos) == 0) {
message("¡Listo! Todos los paquetes del libro están instalados.")
} else {
message("No se pudieron instalar automáticamente: ", paste(fallidos, collapse = ", "),
"\nInténtalos a mano con install.packages('nombre').")
}Vale la pena leer el bloque por partes, porque es un buen ejemplo de código
defensivo. installed.packages() devuelve una tabla de todo lo que ya tienes;
rownames() saca de ahí solo los nombres. setdiff() compara la lista del curso
con esa lista y deja únicamente lo que falta, así que el bloque no pierde
tiempo reinstalando lo que ya está. El for recorre los que faltan e instala uno
por uno, y tryCatch() atrapa el fallo de cualquiera de ellos para que un solo
paquete problemático no detenga la instalación de los otros cuarenta. Al final,
fallidos te dice a cuáles hay que volver a mano.
ggversa (Gráficas Versátiles con ggplot2, de Tremblay &
Hernández-Serrano) está disponible en CRAN, así que se instala igual que los
demás con install.packages("ggversa").
Si algún paquete se niega a instalarse, casi siempre es una de tres cosas: te falta una herramienta de compilación del sistema (en macOS, las Command Line Tools de Xcode; en Windows, Rtools), el paquete no está disponible para tu versión de R, o hay un problema momentáneo del espejo de CRAN. Antes de pelear con él, fíjate si de verdad lo necesitas para el capítulo que estás haciendo: casi ninguno es indispensable para el curso completo.
2.4 Verificar qué está instalado
Este bloque no instala nada; solamente te dice cuáles paquetes ya tienes y cuáles te faltan.
paquetes_curso <- c(
"tidyverse", "datos", "ggversa", "nycflights13", "babynames", "nasaweather",
"fueleconomy", "Lahman", "readxl", "haven", "data.table", "hms", "zoo",
"gt", "flextable", "knitr", "bookdown", "gridExtra", "modelr", "broom",
"tidymodels", "MASS", "DescTools", "GMCM", "TidyDensity",
"leaflet", "maps", "RColorBrewer", "hexSticker", "showtext", "sysfonts",
"magick", "wordcloud", "wordcloud2", "tm", "SnowballC", "stopwords",
"pacman", "devtools", "rinat", "cranlogs", "packageRank"
)
instalados <- paquetes_curso %in% rownames(installed.packages())
data.frame(
paquete = paquetes_curso,
instalado = ifelse(instalados, "sí", "NO (falta)")
)Si quieres ver de un vistazo cuántos te faltan en vez de leer la tabla entera:
installed.packages(), requireNamespace() y .libPaths(): preguntarle a R qué tiene.
installed.packages(): devuelve una tabla con todos los paquetes instalados. Es lenta si tienes muchos, así que se usa una vez y se guarda el resultado.requireNamespace("x", quietly = TRUE): devuelveTRUEoFALSEsegún el paquete esté o no instalado, sin activarlo y sin dar error. Es la forma limpia de preguntar “¿lo tengo?” dentro de un script..libPaths(): te dice en qué carpetas de tu computadora vive tu biblioteca de paquetes. Útil cuando R “pierde” un paquete que juras haber instalado (casi siempre porque instalaste con una versión de R y estás corriendo otra).
2.5 Versiones: por qué importan
Un paquete no es una cosa fija. dplyr de 2016 y dplyr de hoy no tienen las
mismas funciones. Cuando le pides ayuda a alguien y le dices “no me corre”, la
segunda pregunta (después de “¿lo activaste?”) casi siempre es “¿qué versión
tienes?”.
sessionInfo() es el que hay que aprender de memoria. Devuelve tu versión de R,
tu sistema operativo y la versión de cada paquete que tienes activado en ese
momento. Cuando reportes un problema (a mí, a un compañero, o en un foro), pega
la salida de sessionInfo(): con eso, quien te ayude puede reproducir tu
situación exacta. Es también lo que se incluye al final de un análisis serio,
para que dentro de tres años alguien pueda saber con qué herramientas se hizo.
packageVersion(), sessionInfo() y update.packages(): control de versiones.
packageVersion("x"): la versión de un paquete, como‘1.1.4’.sessionInfo(): el retrato completo de tu sesión (R, sistema operativo, paquetes activados y sus versiones). Se pega tal cual cuando pides ayuda.update.packages(ask = FALSE): actualiza todos los paquetes instalados. Conviene hacerlo con calma, no en la semana de entregar un trabajo, porque una actualización puede cambiar el comportamiento de una función.
No actualices paquetes en medio de un análisis que ya te funciona, y menos el día antes de una entrega. Termina el trabajo, entrega, y después actualiza. Un cambio de versión puede hacer que un argumento cambie de nombre o que una función deje de existir, y de repente un documento que compilaba deja de compilar.
2.6 Activar los paquetes principales
En cada capítulo verás al inicio un bloque con library(). El más común es:
library(tidyverse) # ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats
library(datos) # datos en españoltidyverse es un caso especial: no es realmente un paquete de funciones, es un
meta-paquete que no hace más que activar otros ocho de un tirón. Por eso al
correr library(tidyverse) R te imprime esa lista con los nombres y las
versiones de todos, y una sección de Conflicts al final. Esa lista no es un
error: es información. Vale la pena leerla la primera vez.
Si al correr un capítulo aparece un error como
Error in library(xxx): there is no package called 'xxx', regresa a esta página
y ejecuta el bloque de instalación de arriba.
2.7 Llamar una función sin activar el paquete: el operador ::
Hay una segunda manera de usar una función de un paquete: escribir el nombre del paquete, dos dos puntos, y el nombre de la función.
Esto funciona aunque no hayas corrido library(dplyr), siempre que el
paquete esté instalado. Lo que hace :: es ir directamente a buscar la función
en ese paquete, sin activarlo entero.
Es más largo de escribir, así que no se usa para todo. Se usa en tres situaciones, y las tres aparecen en este libro:
- Cuando quieres dejar clarísimo de dónde sale una función, por ejemplo en un script que otra persona va a leer.
- Cuando solo necesitas una función de un paquete grande y no quieres cargar el paquete completo.
- Cuando hay un conflicto de nombres, que es el tema de la próxima sección, y necesitas decirle a R exactamente cuál de las dos funciones quieres.
paquete::funcion(): llamar una función por su dirección completa.
- Qué hace: usa la función
funcion()del paquetepaquetesin activarlo conlibrary(). - Cuándo usarlo: para desambiguar (
dplyr::select()cuandoMASSestá cargado), para usar algo una sola vez, o para escribir código que se lea sin ambigüedad. - Ojo: el paquete tiene que estar instalado.
::evita ellibrary(), no la instalación.
2.8 Cuando dos paquetes tienen una función con el mismo nombre
Nadie coordina los nombres de las funciones en CRAN, así que es normal que dos paquetes distintos usen el mismo nombre para cosas diferentes. Cuando eso pasa, gana el último que activaste. A esto se le llama enmascaramiento (masking).
El ejemplo clásico en este curso es select(). dplyr tiene select() para
escoger columnas. MASS también tiene una función select(), que hace algo
completamente distinto. Si activas MASS después de tidyverse, tu select()
de siempre deja de funcionar y el error que sale (unused arguments) no dice ni
una palabra sobre paquetes.
library(tidyverse)
library(MASS) # ahora MASS::select() tapa a dplyr::select()
select(millas, modelo, clase) # falla
dplyr::select(millas, modelo, clase) # funcionaR te avisa de esto en el momento de activar el paquete, con un mensaje que
empieza por The following object is masked from .... El problema es que ese
mensaje aparece al principio de la sesión y el error aparece media hora después,
así que casi nadie los conecta.
Dos maneras de verlo cuando ya estás en problemas:
Este es probablemente el error más difícil de diagnosticar de todo el curso,
porque el código no cambió y de repente falla. Los enmascaramientos más
frecuentes en el libro son: MASS::select() sobre dplyr::select(),
maps::map() sobre purrr::map(), y stats::filter() sobre dplyr::filter().
La solución siempre es la misma: escribe dplyr:: o purrr:: delante. Volver a
correr library(tidyverse) no lo arregla.
Cuando un capítulo necesita MASS o maps solo para una cosa, la costumbre
sana es no activarlos con library() y llamar lo que haga falta con ::
(MASS::mvrnorm(), maps::map()). Así el paquete hace su trabajo y no te tapa
nada.
2.9 Mantener los paquetes al día
Cada cierto tiempo (una vez por semestre es razonable) conviene actualizar:
Si solo quieres actualizar uno, vuelve a instalarlo:
install.packages("dplyr") siempre trae la versión más reciente de CRAN.
Y hay paquetes que no están en CRAN, sino en GitHub, casi siempre porque están
en desarrollo. Se instalan con devtools:
Un paquete de GitHub no ha pasado por la revisión de CRAN. Puede estar a medio hacer, puede cambiar de un día para otro y puede romper tu análisis. Para el curso, todo lo que necesitas está en CRAN; usa GitHub solo cuando el profesor o la documentación de un análisis específico te lo indique.
2.10 Ejercicios del capítulo
Sobre los ejercicios de este capítulo. Cada ejercicio se entrega con tres
cosas: el script, el resultado (que el bloque corra) y una explicación
en palabras. Este capítulo es de preparación, así que varios ejercicios te
piden hacer algo dentro de RStudio (reiniciar la sesión, mirar un mensaje) y
no solo calcular. Los datos que se usan son millas y diamantes del paquete
datos. La hoja completa para entregar está en
Ejercicios/Ejercicios_Capitulo_02_paquetes.Rmd.
2.10.1 Ejercicio 1. Tu inventario
Usando el bloque de verificación de este capítulo, averigua cuántos de los paquetes del curso te faltan y cuáles son. No los instales todavía: primero cuéntalos.
Verificación: tu respuesta tiene que ser un número (posiblemente 0) y un
vector de nombres. La suma de instalados y faltantes tiene que dar el largo total
de paquetes_curso.
En palabras: ¿por qué installed.packages() es una mala idea dentro de un
ciclo que corre cuarenta veces? Piensa en lo que tiene que hacer R cada vez que
la llamas.
2.10.2 Ejercicio 2. Dónde vive y qué versión es
Averigua tres cosas sobre el paquete datos: en qué carpeta de tu computadora
está instalado, qué versión tienes, y qué versión de R estás usando.
Verificación: debes obtener una ruta de carpeta, un número de versión con
puntos (por ejemplo ‘0.4.0’) y una línea que empiece con R version.
En palabras: si un compañero te dice que un bloque tuyo no le corre, ¿cuál de estos tres datos le pedirías primero y por qué?
2.10.3 Ejercicio 3. Sin library()
Reinicia R (Session > Restart R) y, sin correr ningún library(), produce
una tabla con las 5 primeras filas de millas, quedándote solo con las columnas
fabricante, modelo y autopista. Tienes que usar :: en todo.
Verificación: el bloque debe correr y devolver una tabla de 5 filas y 3
columnas. Después corre search(): en la lista no debe aparecer
package:dplyr.
En palabras: si :: funciona sin library(), ¿por qué no escribimos todo el
libro así?
2.10.4 Ejercicio 4. Provoca el conflicto
En una sesión limpia, activa tidyverse y después MASS. Lee con cuidado el
mensaje que R imprime al activar MASS y cópialo en tu documento. Luego intenta
select(diamantes, corte, precio) y observa qué pasa. Finalmente, arréglalo.
Verificación: la primera versión tiene que fallar, y la versión arreglada
tiene que devolver una tabla con las columnas corte y precio y 53,940 filas.
Usa error = TRUE en las opciones del bloque que falla, para que el documento
compile de todos modos.
En palabras: el mensaje que imprimió MASS contiene la palabra masked.
Explica, con tus palabras y usando lo que devolvió search(), por qué gana
MASS y no dplyr.
2.10.5 Ejercicio 5. El retrato de tu sesión
Activa tidyverse y datos, corre sessionInfo() y guarda la salida en tu
documento.
Verificación: en la sección other attached packages deben aparecer al menos
dplyr, ggplot2 y datos, cada uno con su número de versión.
En palabras: menciona una situación concreta, distinta a pedir ayuda, en la que a ti mismo te serviría tener guardada esta información dentro del documento.
2.10.6 Ejercicio 6 (BONO). Tu propio verificador
Escribe una función llamada revisar_paquetes() que reciba un vector de nombres
de paquetes y devuelva un data.frame con tres columnas: paquete, instalado
(TRUE o FALSE) y version (la versión si está instalado, NA si no lo
está). Pruébala con
c("dplyr", "ggplot2", "datos", "unPaqueteQueNoExiste").
Verificación: el resultado debe tener 4 filas, la última con instalado
en FALSE y version en NA. La función no debe dar error con el paquete
inventado.
En palabras: ¿por qué conviene usar requireNamespace() y no library()
dentro de esta función?