我试图找到一种方法来使用列表清除R中的工作区.
根据文档,我可以简单地创建一个包含所有工作空间对象的向量:WS=c(ls()).但是,当我尝试使用rm(c(ls())或删除元素时,没有任何反应rm(WS).
我知道我可以使用该命令rm(list=ls()).我只想弄清楚R是如何工作的.我在思考如何在rm()带有对象列表的向量上应用函数时犯了错误?
具体来说,我正在尝试创建一个类似于clcMATLAB中的函数的函数,但是我无法使它工作.这是我写的功能:
clc <- function() { rm(list = ls()) }
Run Code Online (Sandbox Code Playgroud)
来自?rm"详细信息"部分:
早期版本的R错误地声称提供字符向量...删除了字符向量中指定的对象,但它删除了字符向量.使用list参数通过字符向量指定对象.
你的尝试应该是:
rm(list = WS)
Run Code Online (Sandbox Code Playgroud)
但是,这仍然会在您的工作空间中留下一个名为"WS"的对象(字符向量),因为它是在您调用之后创建的WS <- c(ls()).要真正摆脱"WS"对象,你将不得不使用rm(WS, list = WS).:-)
它是如何工作的?如果查看代码rm,函数的前几行将捕获已指定的任何单个对象,无论是引用还是不引用.在函数的末尾,您将找到list <- .Primitive("c")(list, names)基本上创建所有单独命名的对象的字符向量以及提供给"list"参数的字符向量中的任何对象的行.
根据您的评论,听起来您正在尝试编写如下函数:
.clc <- function() {
rm(list = ls(.GlobalEnv), envir = .GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)
我认为这有点危险,但让我们测试一下:
ls()
# character(0)
for (i in 1:5) assign(letters[i], i)
ls()
# [1] "a" "b" "c" "d" "e" "i"
.clc()
ls()
# character(0)
Run Code Online (Sandbox Code Playgroud)
注意:仅供参考,我已将该函数命名为.clc(带点),以便在运行该函数时不会将其删除.如果你想编写一个没有的函数版本.,你可能会更好地将函数放在一个包中并在启动时加载它以使该函数可用.