Як я можу видалити всі об'єкти, крім одного, з робочої області в R?


220

У мене є робоча область з великою кількістю об'єктів, і я хотів би видалити всі, крім одного. В ідеалі я хотів би уникати набору тексту rm(obj.1, obj.2... obj.n). Чи можна вказати remove all objects but these ones?

Відповіді:


374

Ось проста конструкція, яка зробить це, використовуючи setdiff:

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

І повний приклад. Запускайте це на свій страх і ризик - це видалить усі змінні, крім x:

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

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

ls()
[1] "x"

8
Метод, який тут використовується, - використовувати list = to rm, що дозволяє передати векторний символ у rm замість списку імен.
Spacedman

53

Використовувати keepфункцію з gdataпакету досить зручно.

> 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, здається, має більше сенсу, і простіше запам'ятати, що вся складність команди в базі R.
Дарій

47

Я думаю, що ще один варіант - відкрити робочу область в RStudio, а потім змінити список на сітку вгорі праворуч (зображення внизу). Потім позначте об'єкти, які потрібно очистити, і, нарешті, натисніть на очистити.

введіть тут опис зображення


3
Так само натисніть поле Ім'я, яке вибирає всі файли, а потім зніміть позначку з усіх файлів, які ви хочете зберегти.
Стівен

27

Я просто витратив кілька годин на полювання на відповідь на подібне, але трохи інше запитання - мені потрібно було вміти видаляти всі об'єкти в R (включаючи функції), за винятком кількох векторів.

Один із способів зробити це:

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

Де вектори, які я хочу зберегти, називаються "a" і "c".

Сподіваюсь, це допоможе кожному, хто шукає те саме рішення!


11
Це також має працювати rm(list=setdiff(ls(), c("a", "c"))), правда? Дивіться відповідь @ Андрі.
hplieninger



6

Це скористається опцією ls()' pattern, якщо у вас багато об'єктів з тим самим малюнком, який ви не хочете зберігати:

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

ох, це здається небезпечним! Чи є спосіб перевірити шаблон, що відповідає а-ля "ехо" в оболонці?
DQdlM

1
Я здогадуюсь, rmфункцію слід завжди використовувати обережно (тим більше в оболонці!). Дивіться мою редакцію для відповіді на ваше запитання.
Петро Діакуміс


3

давайте подумаємо по-іншому, що робити, якщо ми хочемо видалити групу? спробуйте це,

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

Мені особисто не подобається занадто багато таблиць, змінних на моєму екрані, але я не можу уникнути їх використання. Тому я називаю тимчасові речі, що починаються з "xxx", тому я можу їх видалити після того, як вони більше не використовуються.


2

Зсередини функції rm всі об'єкти в .GlobalEnv, крім функції

initialize <- function(country.name) {

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

}

2

Щоб зберегти список файлів, можна використовувати:

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

1

Як щодо цього?

# 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, із середовища:

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

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

-9

Далі буде видалено всі об’єкти з вашої консолі

rm(list = ls())

4
Перш за все, це не те, що просили. По-друге, про всі можливі способи цього в R було висвітлено у попередніх відповідях. Ви дуже раді допомогти іншим користувачам, які мають нові запитання. Це було вирішено вже 6 років тому, і це рішення існує і сьогодні.
Joris Meys
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.