Biri dışındaki tüm nesneleri R'deki çalışma alanından nasıl kaldırabilirim?


220

Çok sayıda nesne içeren bir çalışma alanım var ve biri hariç hepsini kaldırmak istiyorum. İdeal olarak yazmak zorunda kalmamak istiyorum rm(obj.1, obj.2... obj.n). Belirtmek mümkün mü remove all objects but these ones?

Yanıtlar:


375

İşte bunu kullanarak basit bir yapı setdiff:

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

Ve tam bir örnek. Bunu kendi sorumluluğunuzda çalıştırın - aşağıdakiler dışındaki tüm değişkenleri kaldıracaktır x:

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

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

ls()
[1] "x"

8
Burada kullanılan teknik, list = to rm işlevini kullanmaktır; bu, bir karakter vektörünün ad listesi yerine rm'ye iletilmesine izin verir.
Spacedman

54

Kullanılması keepgelen işlevi gdatapaketinin oldukça uygundur.

> 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"

Gdata'dan "keep" kullanmanın daha mantıklı göründüğünü ve R tabanındaki komandonun tüm karmaşıklığının hatırlamak daha kolay olduğunu düşünüyorum
Darius

47

Sanırım başka bir seçenek çalışma ortamını RStudio'da açmak ve daha sonra listeyi ortamın sağ üst köşesindeki ızgaraya değiştirmek (aşağıdaki resim). Ardından, temizlemek istediğiniz nesneleri işaretleyin ve son olarak temizle'ye tıklayın.

resim açıklamasını buraya girin


3
Aynı şekilde, tüm dosyaları seçen Ad kutusunu tıklatın ve saklamak istediğiniz tüm dosyaların seçimini kaldırın.
Stephen

27

Benzer ama biraz farklı bir sorunun cevabını aramak için birkaç saat harcadım - bir avuç vektör hariç R'deki (fonksiyonlar dahil) tüm nesneleri silebilirdim.

Bunu yapmanın bir yolu:

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

Saklamak istediğim vektörlere 'a' ve 'c' denir.

Umarım bu aynı çözümü arayan herkese yardımcı olur!


11
Bu da işe yaramalı rm(list=setdiff(ls(), c("a", "c"))), değil mi? @ Andrie'nin cevabına bakınız.
hplieninger

17

Adları bir desenle eşleşen tüm nesneleri tutmak için şunları kullanabilirsiniz grep:

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


6

Bu, ls()' patternseçeneğinden yararlanır , aynı desende tutmak istemediğiniz birçok nesneniz olması durumunda:

> 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, bu tehlikeli görünüyor! Kabuktaki bir la "eko" ile eşleşen deseni test etmenin bir yolu var mı?
DQdlM

1
Sanırım rmfonksiyon her zaman dikkatli kullanılmalıdır (daha çok kabukta!). Sorunuzun cevabı için düzenlememe bakın.
Peter Diakumis


3

farklı bir şekilde düşünelim, ya bir grubu çıkarmak istersek? bunu dene,

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

Şahsen ekranımdaki çok fazla tabloyu, değişkeni sevmiyorum, ancak bunları kullanmaktan kaçınamıyorum. Bu yüzden "xxx" ile başlayan geçici şeyleri adlandırıyorum, böylece artık kullanılmadıktan sonra bunları kaldırabilirim.


2

Bir işlev içinden, .GlobalEnv içindeki tüm nesneleri işlev dışında rm

initialize <- function(country.name) {

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

}

2

Dosyaların bir listesini tutmak için aşağıdakiler kullanılabilir:

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

1

Buna ne dersin?

# 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

df dışındaki her nesneyi ortamdan kaldırmak istediğinizi varsayarsak:

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

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

-9

Aşağıdakiler konsolunuzdaki tüm nesneleri kaldıracak

rm(list = ls())

4
Her şeyden önce, bu sorulan şey değil. İkincisi, bunu R'de yapmanın olası her yolu önceki cevaplarda ele alınmıştır. Yeni soruları olan diğer kullanıcılara yardımcı olabilirsiniz. Bu zaten 6 yıl önce çözüldü ve bu çözüm hala duruyor.
Joris Meys
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.