2014-09-22 12 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(".") 
相關問題