如何从 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 工作区中删除所有自定义方法和类?的主要内容,如果未能解决你的问题,请参考以下文章

批量从自定义选项magento中删除所需的参数

阶段3 1.Mybatis_03.自定义Mybatis框架_3.自定义mybatis的编码-根据测试类中缺少的创建接口和类

如何从自定义导航栏中删除这条黑线

通过描述符和类装饰器,自定义staicmethod(静态方法)

您如何真正从 UIMenuController 中删除 Copy

如何通过在自定义视图中按下按钮从超级视图中删除自定义视图?