¿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?

DQdlM
fuente

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"
Andrie
fuente
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"
Rahul Premraj
fuente
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í

Sadegh
fuente
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!

Garra
fuente
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)
Aaron dejó Stack Overflow
fuente
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"
Peter Diakumis
fuente
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
require(gdata)
keep(object_1,...,object_n,sure=TRUE)
ls()
Acebo
fuente
1
Duplicado de la respuesta de @Rahul Premraj .
hplieninger
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.

Grec001
fuente
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)
  }

}
Griffith Feeney
fuente
2

Para mantener una lista de archivos, uno puede usar:

rm(list=setdiff(ls(), c("df1", "df2")))
Peter
fuente
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)
}
pensar
fuente
1

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

rm(list = ls(pattern="[^df]"))
MCH
fuente
1
# remove all objects but selected
rm(list = ls()[which("key_function" != ls())])
f0nzie
fuente
-9

Lo siguiente eliminará todos los objetos de su consola

rm(list = ls())
Vishnu Kumar
fuente
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