2014-09-22 13 views
6

最近我一直在用S4类进行很多实验,并且重新启动R以清除我的工作空间中的所有类定义和自定义方法是一种痛苦。显然rm(list=ls(all.names=TRUE))是没用的。我可以通过一行一行地手动删除所有的类和方法,但我相信这会有一个更简单的方法。如何从R工作区中删除所有自定义方法和类?

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

.myClass <- setClass("myClass", representation=representation(mySlot="numeric")) 
mySlot <- function(x) [email protected] 
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()是一个被删除的对象h rm,但保留了参考mySlot()的方法。我想知道如何去除全部类和全部定制方法一举。

+1

类可以被删除, AFAIK,带removeClass()。但是,我不知道在你的情况下自动化它的好方法。如果你有一个类名列表,你可以遍历它,然后使用removeClass()移除类。 – ddiez 2014-09-22 16:50:54

回答

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) 
+0

这就是我所需要的。谢谢!基本上,我希望R从会话中什么都不记得,并能够重新开始。 – 2014-09-22 17:22:20

1

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

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

这是痛苦所以要么你重新启动R或更好的是你定义的类,并使用一些工具devtools加载一切使用像创建自定义包

devtools::load_all(".") 
相关问题