如何从R中的工作空间中删除除一个对象以外的所有对象?


219

我的工作区中有很多对象,但我想删除所有对象。理想情况下,我希望避免键入rm(obj.1, obj.2... obj.n)。有可能指出 remove all objects but these ones吗?

Answers:


373

这是一个简单的构造,可以通过使用来完成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
此处使用的技术是对rm使用list =,这允许将字符向量传递给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
同样,单击“名称”框,这将选择所有文件,然后取消选择要保留的所有文件。
斯蒂芬

25

我只是花了几个小时寻找一个类似但略有不同的问题的答案-我需要能够删除R中除少数向量外的所有对象(包括函数)。

一种方法是:

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

我要保留的向量分别命名为“ a”和“ c”。

希望这对任何寻求相同解决方案的人有所帮助!


10
这也应该起作用rm(list=setdiff(ls(), c("a", "c"))),对吧?参见@Andrie的答案。
hplieninger 2014年

17

要保留名称与模式匹配的所有对象,可以使用grep,如下所示:

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


5

如果您有许多不想保留相同模式的对象,则可以利用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 2014年

1
我猜想该rm函数应始终谨慎使用(在shell中更是如此!)。请参阅我的编辑以获取对您问题的答案。
彼得·迪亚库米


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 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.