【问题标题】:Understanding element wise clearing of R's workspace了解 R 工作区的元素明智清除
【发布时间】:2017-12-30 23:14:31
【问题描述】:

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

根据文档,我可以简单地使用我的所有工作区对象创建一个向量:WS=c(ls())。但是,当我尝试使用 rm(c(ls())rm(WS) 进行元素明智删除时,什么也没有发生。

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


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

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

【问题讨论】:

  • 我正在尝试找到一种在 Rstudio 中清除 WS 的简单方法。我尝试创建一个函数,类似于 matlab 中的 clc 函数来清除工作区,但我无法让它工作。看来,我无法在没有输入的情况下在 R 中创建函数。 clc=function(){ rm(list=ls()) }

标签: r workspace


【解决方案1】:

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

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

你的尝试应该是:

rm(list = WS)

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


它是如何工作的?如果您查看rm 的代码,函数的前几行将捕获已指定的任何单个对象,无论是引用的还是未引用的。在函数的最后,您会发现 list &lt;- .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(带点),以便在函数运行时不会将其删除。如果你想编写一个没有. 的函数版本,你最好将函数放在一个包中并在启动时加载它以使函数可用。

【讨论】:

  • 要真正获取所有内容,您需要在ls() 中设置all=TRUE,否则您将留下任何以.dot 开头的对象
  • 您可以毫无问题地删除该功能。它的当前实例将毫无问题地执行,但它将从内存中删除
  • 我是 R 新手,但我做的第一件事就是为所有我觉得方便的东西创建一个自定义包(cls/clr 是前两个)。似乎没有必要忽略“。”清除工作区后,仍会加载带前缀的函数/数据。
  • @SnOrfus,是的,这适用于包,但不适用于在会话中创建的函数。
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多