¿Cómo puedo eliminar todos los objetos menos uno del espacio de trabajo en R?


219

Tengo un espacio de trabajo con muchos objetos y me gustaría eliminar todos menos uno. Idealmente, me gustaría evitar tener que escribir rm(obj.1, obj.2... obj.n). ¿Es posible indicar remove all objects but these ones?

Respuestas:


373

Aquí hay una construcción simple que lo hará, usando setdiff:

rm(list=setdiff(ls(), "x"))

Y un ejemplo completo. Ejecute esto bajo su propio riesgo: eliminará todas las variables, excepto x:

x <- 1
y <- 2
z <- 3
ls()
[1] "x" "y" "z"

rm(list=setdiff(ls(), "x"))

ls()
[1] "x"

8
La técnica que se usa aquí es usar list = to rm, que permite pasar un vector de caracteres a rm en lugar de una lista de nombres.
Spacedman

53

Usar la keepfunción del gdatapaquete es bastante conveniente.

> ls()
[1] "a" "b" "c"

library(gdata)
> keep(a) #shows you which variables will be removed
[1] "b" "c"
> keep(a, sure = TRUE) # setting sure to TRUE removes variables b and c
> ls()
[1] "a"

Me parece que usar "keep" de gdata parece tener más sentido y es más fácil recordar que toda la complejidad del comando en la base R.
Darius

47

Creo que otra opción es abrir el espacio de trabajo en RStudio y luego cambiar la lista a la cuadrícula en la parte superior derecha del entorno (imagen a continuación). Luego marque los objetos que desea borrar y finalmente haga clic en borrar.

ingrese la descripción de la imagen aquí


3
Del mismo modo, haga clic en el cuadro Nombre, que selecciona todos los archivos, y luego anule la selección de todos los archivos que desea conservar.
Stephen

27

Acabo de pasar varias horas buscando la respuesta a una pregunta similar pero ligeramente diferente: necesitaba poder eliminar todos los objetos en R (incluidas las funciones) excepto un puñado de vectores.

Una forma de hacer esto:

rm(list=ls()[! ls() %in% c("a","c")])

Donde los vectores que quiero mantener se llaman 'a' y 'c'.

¡Espero que esto ayude a cualquiera que busque la misma solución!


11
Esto también debería funcionar, rm(list=setdiff(ls(), c("a", "c")))¿verdad? Ver la respuesta de @ Andrie.
hplieninger

17

Para mantener todos los objetos cuyos nombres coinciden con un patrón, puede usar grep, así:

to.remove <- ls()
to.remove <- c(to.remove[!grepl("^obj", to.remove)], "to.remove")
rm(list=to.remove)


6

Esto aprovecha ls()la patternopción de, en el caso de que tenga muchos objetos con el mismo patrón que no desea conservar:

> foo1 <- "junk"; foo2 <- "rubbish"; foo3 <- "trash"; x <- "gold"  
> ls()
[1] "foo1" "foo2" "foo3" "x"   
> # Let's check first what we want to remove
> ls(pattern = "foo")
[1] "foo1" "foo2" "foo3"
> rm(list = ls(pattern = "foo"))
> ls()
[1] "x"

whoah, eso parece peligroso! ¿Hay alguna forma de probar el patrón que coincida con un "eco" en el shell?
DQdlM

1
Supongo que la rmfunción siempre debe usarse con cuidado (¡más en el shell!). Vea mi edición para obtener una respuesta a su pregunta.
Peter Diakumis


3

pensemos de otra manera, ¿y si queremos eliminar un grupo? prueba esto,

 rm(list=ls()[grep("xxx",ls())]) 

Personalmente no me gustan muchas tablas, variables en mi pantalla, pero no puedo evitar usarlas. Así que nombro las cosas temporales que comienzan con "xxx", para poder eliminarlas después de que ya no se usen.


2

Desde una función, rm todos los objetos en .GlobalEnv excepto la función

initialize <- function(country.name) {

  if (length(setdiff(ls(pos = .GlobalEnv), "initialize")) > 0) {
    rm(list=setdiff(ls(pos = .GlobalEnv), "initialize"), pos = .GlobalEnv)
  }

}

2

Para mantener una lista de archivos, uno puede usar:

rm(list=setdiff(ls(), c("df1", "df2")))

1

¿Qué tal esto?

# Removes all objects except the specified & the function itself.

rme <- function(except=NULL){
  except = ifelse(is.character(except), except, deparse(substitute(except)))
  rm(list=setdiff(ls(envir=.GlobalEnv), c(except,"rme")), envir=.GlobalEnv)
}

1

suponiendo que desea eliminar todos los objetos excepto df del entorno:

rm(list = ls(pattern="[^df]"))

1
# remove all objects but selected
rm(list = ls()[which("key_function" != ls())])

-9

Lo siguiente eliminará todos los objetos de su consola

rm(list = ls())

44
En primer lugar, esto no es lo que se pidió. Segundo, sobre todas las formas posibles de hacerlo en R se ha cubierto en las respuestas anteriores. Le invitamos a ayudar a otros usuarios que tengan nuevas preguntas. Este ya se resolvió hace 6 años, y esa solución sigue en pie hoy.
Joris Meys
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.