我正在尝试使用列表找到一种清除R中工作空间的方法。
根据文档,我可以简单地创建一个包含所有工作区对象的向量:WS=c(ls())
。但是,当我尝试使用rm(c(ls())
或rm(WS)
进行元素删除时,没有任何反应。
我知道我可以使用命令rm(list=ls())
。我只想弄清楚R是如何工作的。我在将rm()
函数应用于带有对象列表的向量时,我在哪里犯了错误?
具体来说,我正在尝试在MATLAB中创建一个类似于clc
函数的函数,但是我无法让它工作。这是我写的函数:
clc <- function() { rm(list = ls()) }
答案 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
(带点),以便在运行函数时不会将其删除。如果你想编写一个没有.
的函数版本,你可能最好将函数放在一个包中并在启动时加载它以使函数可用。