2012-08-29 9 views
13

Alcuni retroscena:Cambiare funzione interna di un pacchetto

devo usare la funzione HMR dal pacchetto HMR molto. Sfortunatamente, questa funzione è molto lenta. (HMR è essenzialmente una funzione di adattamento, che è progettata per essere il più robusta possibile, il che è uno dei motivi della mancanza di efficienza.) Funzione HMR chiama la funzione HMR::.HMR.fit1, che corrisponde al raccordo effettivo. Utilizzo di Rprof So che il problema principale relativo all'efficienza è l'utilizzo di lsfit, che viene chiamato molto. Pertanto, ho modificato il codice di .HMR.fit1 per chiamare direttamente la funzione C utilizzata da lsfit senza l'overhead di lsfit, che dovrebbe comportare un notevole aumento di velocità.

Ora mi piacerebbe sostituire HMR::.HMR.fit1 con la mia funzione modificata e testare HMR se fornisce gli stessi risultati e quanta velocità guadagno.

Ho provato a fare questo:

mod.fun <- function(<many args>) { 
<a lot of code> 
} 
environment(mod.fun) <- environment(.HMR.fit1) 
.HMR.fit1 <- mod.fun 

Tuttavia, HMR::.HMR.fit1 non è cambiato in questo modo e apparentemente HMR::HMR non usa la mia funzione di raccordo modificato. C'è un modo per ottenere ciò che voglio senza creare il pacchetto dal sorgente, cosa che non posso fare a causa delle restrizioni sui diritti dell'utente sul mio computer (Windows)?

In questo momento, la mia soluzione sarebbe quella di copiare il codice di HMR::HMR, ma spero che ci sia una soluzione più conveniente.

risposta

6

Per un test rapido è possibile utilizzare la funzione di trace con edit=TRUE per modificare la funzione, questo farà la sostituzione nella corretta namespace e permettono inoltre di utilizzare untrace per ripristinare la funzione di nuovo all'originale. Queste modifiche non dureranno oltre la sessione corrente.

Problemi correlati