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?

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"

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"

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


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!


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)


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"

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

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.


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

}

2

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

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

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

1

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

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

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

-9

Im Folgenden werden alle Objekte von Ihrer Konsole entfernt

rm(list = ls())

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.