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