Jak mogę usunąć wszystkie obiekty oprócz jednego z obszaru roboczego w R?

220

Mam obszar roboczy z wieloma obiektami i chciałbym usunąć wszystkie oprócz jednego. Idealnie chciałbym uniknąć pisania rm(obj.1, obj.2... obj.n). Czy można to wskazać remove all objects but these ones?

DQdlM
źródło

Odpowiedzi:

374

Oto prosty konstrukt, który to zrobi, używając setdiff:

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

I pełny przykład. Uruchom to na własne ryzyko - usunie wszystkie zmienne oprócz x:

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

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

ls()
[1] "x"
Andrie
źródło
8
Stosowana jest tutaj technika list = to rm, która pozwala na przekazanie wektora znaków do rm zamiast listy nazw.
Spacedman
53

Korzystanie z keepfunkcji z gdatapakietu jest dość wygodne.

> 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
źródło
Uważam, że użycie „trzymaj” z gdata wydaje się mieć więcej sensu i łatwiej jest pamiętać, że cała złożoność komendy w bazie R.
Dariusz
47

Myślę, że inną opcją jest otwarcie obszaru roboczego w RStudio, a następnie zmiana listy na siatkę w prawym górnym rogu środowiska (obrazek poniżej). Następnie zaznacz obiekty, które chcesz usunąć, i na koniec kliknij wyczyść.

wprowadź opis zdjęcia tutaj

Sadegh
źródło
3
Podobnie kliknij pole Nazwa, które zaznacza wszystkie pliki, a następnie odznacz wszystkie pliki, które chcesz zachować.
Stephen
27

Spędziłem kilka godzin na poszukiwaniu odpowiedzi na podobne, ale nieco inne pytanie - musiałem móc usunąć wszystkie obiekty w R (w tym funkcje) oprócz kilku wektorów.

Jednym ze sposobów na to:

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

Gdzie wektory, które chcę zachować, mają nazwy „a” i „c”.

Mam nadzieję, że pomoże to każdemu, kto szuka tego samego rozwiązania!

Talon
źródło
11
To też powinno działać rm(list=setdiff(ls(), c("a", "c"))), prawda? Zobacz odpowiedź @ Andrie.
hplieninger
17

Aby zachować wszystkie obiekty, których nazwy pasują do wzorca, możesz użyć grep:

to.remove <- ls()
to.remove <- c(to.remove[!grepl("^obj", to.remove)], "to.remove")
rm(list=to.remove)
Aaron opuścił Stack Overflow
źródło
6

Wykorzystuje ls()to patternopcję, w przypadku, gdy masz wiele obiektów z tym samym wzorem, którego nie chcesz zachować:

> 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
źródło
whoah, to wydaje się niebezpieczne! Czy istnieje sposób przetestowania wzoru pasującego do echa w powłoce?
DQdlM,
1
Myślę, że z rmfunkcji należy zawsze korzystać ostrożnie (zwłaszcza w powłoce!). Zobacz moją edycję, aby uzyskać odpowiedź na twoje pytanie.
Peter Diakumis,
3
require(gdata)
keep(object_1,...,object_n,sure=TRUE)
ls()
Ostrokrzew
źródło
1
Duplikat @Rahul Premraj za odpowiedź .
hplieninger
3

zastanówmy się inaczej, co jeśli chcemy usunąć grupę? Spróbuj tego,

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

Osobiście nie lubię zbyt wielu tabel, zmiennych na ekranie, ale nie mogę ich uniknąć. Tymczasowe rzeczy nazywam więc od „xxx”, więc mogę je usunąć, gdy nie będą już używane.

Grec001
źródło
2

Z poziomu funkcji, rm wszystkie obiekty w .GlobalEnv oprócz funkcji

initialize <- function(country.name) {

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

}
Griffith Feeney
źródło
2

Aby zachować listę plików, możesz użyć:

rm(list=setdiff(ls(), c("df1", "df2")))
Piotr
źródło
1

Co powiesz na to?

# 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)
}
myśleć
źródło
1

zakładając, że chcesz usunąć każdy obiekt oprócz df ze środowiska:

rm(list = ls(pattern="[^df]"))
MCH
źródło
1
# remove all objects but selected
rm(list = ls()[which("key_function" != ls())])
f0nzie
źródło
-9

Poniższe spowoduje usunięcie wszystkich obiektów z konsoli

rm(list = ls())
Wisznu Kumar
źródło
4
Przede wszystkim nie o to pytano. Po drugie, o każdym możliwym sposobie zrobienia tego w R omówiono w poprzednich odpowiedziach. Serdecznie zapraszamy innych użytkowników, którzy mają nowe pytania. Ten został rozwiązany już 6 lat temu i to rozwiązanie jest nadal aktualne.
Joris Meys,