理解 R 的逐元素清空工作区的方式

5
我正在寻找一种使用列表清除R工作区的方法,与此相关的是it技术。
根据文档,我可以简单地创建一个包含所有工作区对象的向量:WS=c(ls())。但是,当我尝试使用rm(c(ls()))rm(WS)进行逐个元素删除时,什么也没有发生。
我知道可以使用命令rm(list=ls())。我只是想弄清楚R是如何工作的。在将rm()函数应用于包含对象列表的向量时,我在思考上犯了什么错误?
具体而言,我正在尝试创建一个类似于MATLAB中clc函数的函数,但我无法使它正常工作。这是我编写的函数:
clc <- function() { rm(list = ls()) }

还在这里讨论:https://dev59.com/cXA65IYBdhLWcg3w-jym - ToNoY
我正在尝试找到一种简单的方法来清除Rstudio中的工作区。我尝试创建一个函数,类似于Matlab中的clc函数来清除工作区,但我在让它正常工作方面遇到了麻烦。似乎我无法在R中创建没有输入的函数。clc=function(){ rm(list=ls()) } - jessica
1个回答

9

来自?rm,"详情"部分:

R的早期版本错误地声称在...中提供一个字符向量会删除名为该字符向量的对象,但实际上它会删除该字符向量本身。请使用列表参数通过字符向量指定对象。

你的尝试应该是:

rm(list = WS)

然而,这样仍会在您的工作空间中留下一个对象(字符向量),名为“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)

注意: FYI,我已将函数命名为.clc(带有点),以便在运行函数时不被删除。如果您想编写一个没有.的函数版本,您可能更好地将函数放入包中,并在启动时加载该包以使函数可用。


要真正获取所有内容,您需要在ls()内设置all=TRUE,否则您将留下任何以.dot开头的对象。 - Ricardo Saporta
您可以无问题地删除该函数。当前的实例将不会出现问题,但它将从内存中删除。 - Ricardo Saporta
2
我对R语言还很陌生,但我做的第一件事就是创建一个自定义包,用于存放我觉得有用的所有东西(cls/clr是其中的前两个)。似乎不需要忽略以"."为前缀的函数/数据,因为即使在清除工作区后,库仍将被加载。 - Steven Evers
@SnOrfus,对于一个包是正确的,但对于在会话中创建的函数则不然。 - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接