如何从 R 工作区中删除所有自定义方法和类?
Posted
技术标签:
【中文标题】如何从 R 工作区中删除所有自定义方法和类?【英文标题】:How can I remove all custom methods and classes from an R workspace? 【发布时间】: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() 删除这些类。 【参考方案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(".")
【讨论】:
以上是关于如何从 R 工作区中删除所有自定义方法和类?的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 1.Mybatis_03.自定义Mybatis框架_3.自定义mybatis的编码-根据测试类中缺少的创建接口和类
通过描述符和类装饰器,自定义staicmethod(静态方法)