理解R的工作空间的元素清除

时间:2013-12-05 01:44:57

标签: r workspace

我正在尝试使用列表找到一种清除R中工作空间的方法。

根据文档,我可以简单地创建一个包含所有工作区对象的向量:WS=c(ls())。但是,当我尝试使用rm(c(ls())rm(WS)进行元素删除时,没有任何反应。

我知道我可以使用命令rm(list=ls())。我只想弄清楚R是如何工作的。我在将rm()函数应用于带有对象列表的向量时,我在哪里犯了错误?


具体来说,我正在尝试在MATLAB中创建一个类似于clc函数的函数,但是我无法让它工作。这是我写的函数:

clc <- function() { rm(list = ls()) }

1 个答案:

答案 0 :(得分:9)

来自?rm,“详细信息”部分:

  

早期版本的R错误地声称提供字符向量...删除了字符向量中指定的对象,但它删除了字符向量。使用list参数通过字符向量指定对象。

你的尝试应该是:

rm(list = WS)

HOWEVER ,这仍然会在您的工作空间中留下一个名为“WS”的对象(字符向量),因为它是在之后创建的 >你打电话给WS <- c(ls())。要真正摆脱“WS”对象,您必须使用rm(WS, list = WS)。 : - )


它是如何工作的?如果查看rm的代码,函数的前几行将捕获已指定的任何单个对象,无论是引用还是不引用。接近函数的末尾,您将找到行list <- .Primitive("c")(list, names),它基本上创建了单独命名的所有对象的字符向量,以及提供给“list”参数的字符向量中的任何对象。


更新

根据您的评论,听起来您正在尝试编写如下函数:

.clc <- function() {
 rm(list = ls(.GlobalEnv), envir = .GlobalEnv)
}

我认为这有点危险,但让我们测试一下:

ls()
# character(0)
for (i in 1:5) assign(letters[i], i)
ls()
# [1] "a" "b" "c" "d" "e" "i"
.clc() 

ls()
# character(0)

注意 :仅供参考,我已将函数命名为.clc(带点),以便在运行函数时不会将其删除。如果你想编写一个没有.的函数版本,你可能最好将函数放在一个包中并在启动时加载它以使函数可用。