Come posso rimuovere tutti gli oggetti tranne uno dallo spazio di lavoro in R?


219

Ho uno spazio di lavoro con molti oggetti e vorrei rimuovere tutti tranne uno. Idealmente, vorrei evitare di dover digitare rm(obj.1, obj.2... obj.n). È possibile indicare remove all objects but these ones?

Risposte:


373

Ecco un semplice costrutto che lo farà, usando setdiff:

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

E un esempio completo. Esegui questo a tuo rischio e pericolo: rimuoverà tutte le variabili tranne x:

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

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

ls()
[1] "x"

8
La tecnica utilizzata qui è usare list = to rm, che consente di passare un vettore di caratteri a rm invece di un elenco di nomi.
Spacedman,

53

L'uso della keepfunzione dal gdatapacchetto è abbastanza 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"

Trovo che usare "keep" da gdata sembra avere più senso ed è più facile ricordare che tutta la complessità del comando in base R.
Darius

47

Penso che un'altra opzione sia quella di aprire l'area di lavoro in RStudio e quindi cambiare l'elenco in griglia in alto a destra dell'ambiente (immagine in basso). Quindi spunta gli oggetti che vuoi cancellare e infine fai clic su Cancella.

inserisci qui la descrizione dell'immagine


3
Allo stesso modo, fai clic sulla casella Nome, che seleziona tutti i file, quindi deseleziona tutti i file che desideri conservare.
Stephen,

27

Ho trascorso diverse ore a cercare la risposta a una domanda simile ma leggermente diversa: dovevo essere in grado di eliminare tutti gli oggetti in R (comprese le funzioni) tranne una manciata di vettori.

Un modo per farlo:

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

Dove i vettori che voglio mantenere sono chiamati "a" e "c".

Spero che questo aiuti chiunque cerchi la stessa soluzione!


11
Anche questo dovrebbe funzionare rm(list=setdiff(ls(), c("a", "c"))), giusto? Vedi la risposta di @ Andrie.
hplieninger,

17

Per mantenere tutti gli oggetti i cui nomi corrispondono a un modello, è possibile utilizzare grep, in questo modo:

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


6

Questo si avvale di ls()'s patternopzione, nel caso si hanno un sacco di oggetti con lo stesso modello che non si desidera mantenere:

> 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, sembra pericoloso! C'è un modo per testare il modello corrispondente a una "eco" nella shell?
DQdlM l'

1
Immagino che la rmfunzione dovrebbe sempre essere usata con cura (tanto più nella shell!). Vedi la mia modifica per una risposta alla tua domanda.
Peter Diakumis,


3

pensiamo in modo diverso, e se volessimo rimuovere un gruppo? prova questo,

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

Personalmente non mi piacciono troppe tabelle e variabili sul mio schermo, ma non posso evitare di usarle. Quindi nomina le cose temporanee che iniziano con "xxx", quindi posso rimuoverle dopo che non sono più utilizzate.


2

Dall'interno di una funzione, inserire tutti gli oggetti in .GlobalEnv tranne la funzione

initialize <- function(country.name) {

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

}

2

Per mantenere un elenco di file, è possibile utilizzare:

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

1

Cosa ne pensi di questo?

# 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

supponendo di voler rimuovere ogni oggetto tranne df dall'ambiente:

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

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

-9

Quanto segue rimuoverà tutti gli oggetti dalla tua console

rm(list = ls())

4
Prima di tutto, questo non è quello che è stato chiesto. In secondo luogo, ogni possibile modo di farlo in R è stato trattato nelle risposte precedenti. Sei il benvenuto per aiutare altri utenti che hanno nuove domande. Questo è stato risolto già 6 anni fa e quella soluzione esiste ancora oggi.
Joris Meys,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.