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?

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"

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"

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


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!


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)


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"

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

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.


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

}

2

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

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

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

1

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

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

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

-9

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

rm(list = ls())

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.