2014-09-22 9 views
6

Ultimamente sto sperimentando molto con le classi S4, ed è raro riavviare R per cancellare tutte le definizioni di classe e i metodi personalizzati dal mio spazio di lavoro. Ovviamente rm(list=ls(all.names=TRUE)) non serve a niente. Potrei rimuovere manualmente tutte le classi e i metodi singolarmente scrivendo le righe una alla volta, ma sono sicuro che ci sarà un modo più semplice.Come posso rimuovere tutti i metodi e le classi personalizzati da uno spazio di lavoro R?

Un esempio in mostra il mio problema:

.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]) 
}) 

tenta di rimuovere il tutto con rm():

rm(list=ls(all.names=TRUE)) 

Tuttavia, la definizione della classe e metodo personalizzato sono ancora presenti:

> x <- new("myClass", mySlot=1:4) 
> x[1] 
Error in x[1] : could not find function "mySlot" 

Dal momento che mySlot() era un oggetto è stato rimosso con spirito h rm, ma il metodo che fa riferimento a mySlot() è rimasto. Mi piacerebbe sapere come rimuovere tutte le classi e tutti i metodi personalizzati in un colpo solo.

+1

classi possono essere rimossi, AFAIK, con removeClass(). Tuttavia, non conosco un buon modo per automatizzarlo nel tuo caso. Se tu avessi una lista di nomi di classe, potresti iterarlo e rimuovere le classi con removeClass(). – ddiez

risposta

7

È difficile sapere cosa speri che R ricorderà della tua sessione. È possibile

removeClass("myClass", where=.GlobalEnv) 
removeMethods("[", where=.GlobalEnv) 

o se hai perso traccia di ciò, tutto quello che hai fatto le seguenti hack potrebbe aiutare

## 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

Questo fa quello che mi serve. Grazie! Fondamentalmente, volevo che R non ricordasse nulla della sessione e potesse ricominciare daccapo. –

1

Questo è un commento, ma è troppo lungo così ho messo come una domanda.

È possibile rimuovere la definizione di una classe utilizzando removeClass. Tuttavia, rimuovendo la definizione di una classe non vengono rimossi i metodi a cui sono associati . Per rimuovere davvero una classe, è necessario rimuovere la classe per rimuovere tutti i suoi metodi utilizzando removeMethod.

Questo è doloroso quindi o si riavvia R o meglio è quello di creare un pacchetto personalizzato dove si definisce la classe e utilizzare alcuni strumenti devtools per caricare tutto usare qualcosa come:

devtools::load_all(".") 
Problemi correlati