【问题标题】:How can I remove all custom methods and classes from an R workspace?如何从 R 工作区中删除所有自定义方法和类?
【发布时间】:2014-11-16 16:41:49
【问题描述】:

我最近对 ​​S4 类进行了很多试验,为了从我的工作区中清除所有类定义和自定义方法,重新启动 R 是一件很痛苦的事情。显然rm(list=ls(all.names=TRUE)) 没有用。我可以逐行逐行手动删除所有类和方法,但我相信一定有更简单的方法。

一个展示我的问题的例子:

.myClass <- setClass("myClass", representation=representation(mySlot="numeric"))
mySlot <- function(x) x@mySlot
setMethod("[", signature=c("myClass", "numeric", "missing"), function(x, i, j, ...) {
  initialize(x, mySlot=mySlot(x)[i])
})

尝试使用rm() 删除所有内容:

rm(list=ls(all.names=TRUE))

但是,类定义和自定义方法仍然存在:

> x <- new("myClass", mySlot=1:4)
> x[1]
Error in x[1] : could not find function "mySlot"

由于mySlot() 是一个对象,它被rm 删除,但引用mySlot() 的方法仍然存在。我想知道如何一举移除所有类和所有自定义方法。

【问题讨论】:

  • 类可以被删除,AFAIK,使用 removeClass()。但是,我不知道在您的情况下自动化它的好方法。如果你有一个类名列表,你可以遍历它并使用 removeClass() 删除这些类。

标签: r class s4


【解决方案1】:

很难知道您希望 R 会记住您的会话。你可以

removeClass("myClass", where=.GlobalEnv)
removeMethods("[", where=.GlobalEnv)

或者,如果您忘记了您所做的一切,那么以下 hack 可能会有所帮助

## Class definitions are prefixed by '.__C__'
mangled <- grep(".__C__", ls(all=TRUE, envir=.GlobalEnv), value=TRUE)
classes <- sub(".__C__", "", mangled)
for (cl in classes) removeClass(cl, where=.GlobalEnv)

## Methods tables are prefixed by '.__T__'
mangled <- grep(".__T__", ls(all=TRUE, envir=.GlobalEnv), value=TRUE)
methods <- unique(sub(".__T__(.*):.*", "\\1", mangled))
for (meth in methods) removeMethods(meth, where=.GlobalEnv)

【讨论】:

  • 这就是我需要的。谢谢!基本上,我希望 R 不记得会话中的任何内容并能够重新开始。
【解决方案2】:

这是一条评论,但太长了,所以我把它作为答案。

您可以使用removeClass 删除类的定义。但是,删除类的定义并不会删除 与之相关联。要真正删除一个类,有必要删除 然后使用removeMethod 删除其所有方法。

这很痛苦,所以要么重新启动 R,要么更好地创建一个自定义包,在其中定义你的类并使用一些工具 devtools 加载所有内容,例如:

devtools::load_all(".")

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2021-12-29
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多