如何从R工作区中删除所有自定义方法和类?

时间:2014-09-22 16:24:50

标签: r class s4

我最近一直在尝试使用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()的方法仍然存在。我想知道如何一举删除所有类和所有自定义方法。

2 个答案:

答案 0 :(得分:7)

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

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

如果您已经忘记了所做的一切,以下黑客可能会有所帮助

## 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)

答案 1 :(得分:1)

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

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

这很痛苦所以要么你重新启动R或者更好的是创建一个自定义包你定义你的类并使用一些工具devtools来加载所有东西,比如:

devtools::load_all(".")