2013-05-01 20 views
7

Ho provato a modificare e ridefinire una funzione (xcmsRaw) in XCMS pacchetto R definendo prima funzioneRidefinire una funzione in un pacchetto R

my.xcmsRaw <- function(filename, profstep = 1, profmethod = "bin", 
        profparam = list(mzcorrf=1), # PATCH - mzcorrf is the m/z correction factor, e.g. 0.99888 for long-chain hydrocarbons 
        includeMSn = FALSE, mslevel=NULL, 
        scanrange=NULL) { ... } 

e digitando

unlockBinding("xcmsRaw", as.environment("package:xcms")) 
assign("xcmsRaw", my.xcmsRaw, as.environment("package:xcms")) 
lockBinding("xcmsRaw", as.environment("package:xcms")) 

Tuttavia, quando l'eseguo mi dà l'errore

Error in get(as.character(FUN), mode = "function", envir = envir) : 
    object 'profBinM' of mode 'function' was not found 

causata da non trovando la funzione profBinM, che è un codice C funct ione definito nel file xcms.c del pacchetto xcms.

Ogni pensiero su come avrei potuto risolvere questo problema? (Sto lavorando sotto Windows 7, utilizzando R versione 3.0.0)

+0

hai provato 'assignInNamespace()', come in, ad esempio, [questo esempio] (http://stackoverflow.com/questions/15505607/diagonal-labels-orientation- on-asse x-in-heatmaps/15506652 # 15506652)? Nel tuo caso, useresti qualcosa come 'assignInNamespace (x =" xcmsRaw ", value =" my.xcmsRaw ", ns = asNamespace (" xcms "))'. –

+0

Grazie per il suggerimento, ho appena provato, ma purtroppo mi dà lo stesso errore, purtroppo ... –

+0

Interessante. Giusto per essere precisi/chiari, 'profBinM()' è una funzione R che racchiude una funzione C. –

risposta

5

Grazie Josh - nel mio caso ho ottenuto che funziona ora via

modifline='if ((profparam$mzcorrf!=1)&length(unique(rawdata$mz - trunc(rawdata$mz)))!=1) {rawdata$mz=rawdata$mz*profparam$mzcorrf} else if (profparam$mzcorrf!=1) {print("Exact masses were already rounded to nominal masses");profparam$mzcorrf=1}' 
insertatline=6 
trace(xcmsRaw, tracer=modifline,at=c(insertatline)) 

dove ho trovato la linea giusta per inserire il mio codice modificato utilizzando

as.list(body(xcmsRaw)) 

per eliminare l'output di traccia I quindi definita una seconda funzione

xcmsRaw2=function(...) {sink("NUL");obj=xcmsRaw(...);sink();return(obj) } 

che può il be essere chiamato e che non fornisce alcun output di tracciamento non necessario.

Sarebbe comunque bello farlo funzionare tramite assignInNamespace() anche se, poiché ciò consentirebbe modifiche/ridefinizioni più estese e anche per le modifiche negli argomenti della funzione (che sarebbe un motivo comune per ridefinire le funzioni, cioè , di prendere qualche argomento in più) ...

+0

Great! Sono d'accordo, questo sembra un hack, ma è probabile. molto meglio di niente fino a quando non si ottiene una soluzione più flessibile/elegante. –

+0

Sì, è giusto, grazie ancora per il tuo tempo e il tuo aiuto! –

+0

Oh sì, e c'è davvero un modo per sopprimere l'output di traccia? Ora ogni volta che chiamo xcmsRaw verrà stampato "Tracing xcmsRaw (files [samplenr], profstep = profst, profmethod =" bin ", .... step 6" - ma vorrei sopprimere questa uscita. C'è un modo per –

Problemi correlati