1 Intro
Ya sabemos que en R, los objetos que se van creando al hacer un análisis se guardan en el Global Environment1, por lo que si creamos muchos objetos intermedios y/o trabajamos con objetos muy grandes, podemos llegar a tener problemas de memoria; así que hay que aprender a borrar los objetos que ya no necesitamos y tener el Global medio limpio. Vamos a ello
2 Borrando objetos con base::rm()
Podemos hacerlo de varias maneras, siempre usando la función rm()
:
Borrando objetos de “uno en uno”
Fíjate bien que base::rm()
admite que pongas el nombre del objeto que quieres borrar, por ejemplo aa
, pero también puedes poner el nombre del objeto entre comillas como carácter ("aa"
). Utilizando jerga R, puedes poner el name o el quoted name.
Quiero volver a insistir en este punto, así que si miras la ayuda de la función base::rm()
verás que para su primer argumento indica:
the objects to be removed, as names (unquoted) or character strings (quoted)
Borrando varios objetos a la vez
Si queremos borrar varios objetos a la vez, podemos hacerlo pasándole varios nombres de objetos al primer argumento de la función ...
de base::rm()
Borrando objetos, pero usando el segundo argumento de base::rm()
Vamos a borrar objetos, PERO en lugar de pasar los nombres de los objetos al primer argumento de la función ...
, los pasaremos al segundo argumento de la función list
.
Importante: A este segundo argumento de la función hay que pasarle los nombres de los objetos a eliminar como un vector de caracteres; es decir, como “quoted names”.
Podemos pasar al argumento list
un vector de quoted names. Por ejemplo:
Fíjate que el objeto my_objetos_to_borrar
no se ha borrado.
Borrando todos los objetos del Global Environment
En el siguiente chunk borraremos todos los objetos del Global Environment. Para ello usamos la función base::ls()
:
Para entenderlo ejecuta base::ls()
y verás que devuelve un vector con los nombres (quoted) de todos los objetos que haya en el Global
3 Otras estrategias de borrado
Borrar todo excepto …
Volvemos a crear 4 objetos y borraremos todos excepto el objeto aa
. Para ello utilizamos la función base::setdiff()
que devuelve los elementos de un vector que no están en otro vector.
#- creamos 4 objetos
aa <- 1:10 ; bb <- 40:45; cc <- 100:105; dd <- 200:205
#- borramos todos los objetos excepto aa
#- Necesariamente tenemos que usar "aa" entre comillas; es decir el quoted name, porque usamos el segundo argumento list
rm(list = setdiff(ls(), "aa")) #- borra todos los objetos en el Global, excepto aa
Explicaciones
En el anterior chunk, estamos usando 3 funciones (del paquete base); de hecho podríamos ser más explícitos y escribir el chunk como:
base::ls()
devuelve un vector con los nombres de los objetos en el Global Environment como character (es decir, quoted)base::setdiff(x, y)
: coge 2 vectores, x e y, para devolver los elementos de x que no están en ybase::rm()
: borra los objetos que le pasemos como argumento. Si le pasamoslist = ls()
borra todos los objetos en el Global Environment.
Para entenderlo del todo vamos a ejecutar las funciones por separado:
#- creamos 4 objetos
aa <- 1:10 ; bb <- 40:45; cc <- 100:105; dd <- 200:205
ls() #- devuelve los nombres de los objetos en el Global Environment (quoted)
setdiff(ls(), "aa") #- devuelve los nombres de los objetos en el Global Environment que no son "aa"
rm(list = setdiff(ls(), "aa")) #- borra todos los objetos en el Global, excepto aa
rm(setdiff(ls(), "aa")) #- borra todos los objetos en el Global, excepto aa
Estrategia alternativa: elijiendo qué no borrar
Entender la expresión es un poco más complicado, pero tampoco tanto. Para entenderla es mejor ejecutar la expresión por partes.
4 Borrar los que empiezan por un patrón
5 Conclusion
Es bueno mantener el Global Environment limpio. Si estamos trabajando en un proyecto, es mejor borrar los objetos que ya no necesitamos. Para ello podemos usar la función base::rm()
.
La función base::rm()
permite borrar todos los objetos en el Global, con rm(list = ls())
, o borrar solo algunos objetos; por ejemplo rm(aa, "bb")
.
También podemos utilizar patrones más complejos para borrar solo algunos objetos. Por ejemplo, podemos borrar los objetos que empiezan por un patrón, o borrar todos los objetos excepto algunos que nos interesa mantener.
No te lo recomiendo ahora mismo, pero si tienes ganas de profundizar en el tema, te recomiendo que leas este hilo de la comunidad de RStudio. Aparecen ideas sobre los conceptos de clean environment y reproducibilidad. En el hilo también aparece Hadley dando su opinión sobre el tema, concretamente aquí.