Wie kann ich alle Objekte außer einem aus dem Arbeitsbereich in R entfernen?

219

Ich habe einen Arbeitsbereich mit vielen Objekten und möchte alle bis auf einen entfernen. Idealerweise möchte ich vermeiden, tippen zu müssen rm(obj.1, obj.2... obj.n). Kann man angeben remove all objects but these ones?

DQdlM
quelle

Antworten:

373

Hier ist ein einfaches Konstrukt, das dies mithilfe von setdiff:

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

Und ein vollständiges Beispiel. Führen Sie dies auf eigenes Risiko aus - es werden alle Variablen entfernt, außer x:

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

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

ls()
[1] "x"
Andrie
quelle
8
Die hier verwendete Technik besteht darin, list = to rm zu verwenden, wodurch ein Zeichenvektor anstelle einer Liste von Namen an rm übergeben werden kann.
Spacedman
53

Die Verwendung der keepFunktion aus dem gdataPaket ist sehr praktisch.

> 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
quelle
Ich finde, dass die Verwendung von "keep" von gdata sinnvoller erscheint und es einfacher ist, sich daran zu erinnern, dass die gesamte Komplexität des Befehls in Basis R.
Darius
47

Ich denke, eine andere Möglichkeit besteht darin, den Arbeitsbereich in RStudio zu öffnen und dann die Liste in das Raster oben rechts in der Umgebung zu ändern (Bild unten). Aktivieren Sie dann die Objekte, die Sie löschen möchten, und klicken Sie schließlich auf Löschen.

Geben Sie hier die Bildbeschreibung ein

Sadegh
quelle
3
Klicken Sie ebenfalls auf das Feld Name, in dem alle Dateien ausgewählt werden, und deaktivieren Sie dann alle Dateien, die Sie behalten möchten.
Stephen
26

Ich habe nur einige Stunden damit verbracht, nach der Antwort auf eine ähnliche, aber etwas andere Frage zu suchen - ich musste in der Lage sein, alle Objekte in R (einschließlich Funktionen) außer einer Handvoll Vektoren zu löschen.

Ein Weg, dies zu tun:

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

Wo die Vektoren, die ich behalten möchte, 'a' und 'c' heißen.

Hoffe das hilft jedem, der nach der gleichen Lösung sucht!

Talon
quelle
11
Das sollte auch funktionieren rm(list=setdiff(ls(), c("a", "c"))), oder? Siehe @ Andries Antwort.
Hplieninger
17

Um alle Objekte zu behalten, deren Namen mit einem Muster übereinstimmen, können Sie Folgendes verwenden grep:

to.remove <- ls()
to.remove <- c(to.remove[!grepl("^obj", to.remove)], "to.remove")
rm(list=to.remove)
Aaron verließ Stack Overflow
quelle
6

Dies nutzt ls()die patternOption von 's , falls Sie viele Objekte mit demselben Muster haben, das Sie nicht behalten möchten:

> 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
quelle
whoah, das scheint gefährlich! Gibt es eine Möglichkeit, das Muster zu testen, das mit dem "Echo" in der Shell übereinstimmt?
DQdlM
1
Ich denke, die rmFunktion sollte immer mit Vorsicht verwendet werden (mehr in der Shell!). Eine Antwort auf Ihre Frage finden Sie in meiner Bearbeitung.
Peter Diakumis
3
require(gdata)
keep(object_1,...,object_n,sure=TRUE)
ls()
Stechpalme
quelle
1
Duplikat der Antwort von @Rahul Premraj .
Hplieninger
3

Lassen Sie uns anders denken, was ist, wenn wir eine Gruppe entfernen wollen? Versuche dies,

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

Ich persönlich mag nicht zu viele Tabellen und Variablen auf meinem Bildschirm, aber ich kann es nicht vermeiden, sie zu verwenden. Also benenne ich die temporären Dinge, die mit "xxx" beginnen, damit ich sie entfernen kann, nachdem sie nicht mehr verwendet werden.

Grec001
quelle
2

Rm innerhalb einer Funktion alle Objekte in .GlobalEnv mit Ausnahme der Funktion

initialize <- function(country.name) {

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

}
Griffith Feeney
quelle
2

Um eine Liste von Dateien zu führen, kann man verwenden:

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

Wie wäre es damit?

# 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)
}
denken
quelle
1

Angenommen, Sie möchten jedes Objekt außer df aus der Umgebung entfernen:

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

Im Folgenden werden alle Objekte von Ihrer Konsole entfernt

rm(list = ls())
Vishnu Kumar
quelle
4
Zunächst wurde dies nicht gefragt. Zweitens wurde in den vorherigen Antworten auf jede mögliche Art und Weise, dies in R zu tun, eingegangen. Sie können gerne anderen Benutzern helfen, die neue Fragen haben. Dieser wurde bereits vor 6 Jahren gelöst, und diese Lösung steht noch heute.
Joris Meys