2013-05-01 14 views
7

że próbuje modyfikować i ponownego funkcji (xcmsRaw) w xcms pakietu R najpierw definiowania funkcjiPrzedefiniowanie funkcji w pakiecie 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) { ... } 

i wpisywania

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

Jednakże, gdy Uruchomiłem go, ponieważ powoduje to błąd spowodowany przez nie odnalezienie funkcji profBinM, która jest funkcją kodu C. jon zdefiniowany w pliku xcms.c pakietu xcms.

Wszelkie uwagi na temat tego, jak rozwiązać ten problem? (Ja pracuje pod kontrolą systemu Windows 7, stosując R w wersji 3.0.0)

+0

Czy próbowałeś 'assignInNamespace()', jak w, np. [ten przykład] (http://stackoverflow.com/questions/15505607/diagonal-labels-orientation- on-x-axis-in-heatmaps/15506652 # 15506652)? W twoim przypadku użyjesz czegoś takiego jak 'assignInNamespace (x =" xcmsRaw ", value =" my.xcmsRaw ", ns = asNamespace (" xcms "))'. –

+0

Dzięki za sugestię, po prostu wypróbowałem, ale nadal daje mi ten sam błąd, niestety ... –

+0

Interesujące. Aby być precyzyjnym/czystym, 'profBinM()' jest funkcją R zawija funkcję C. –

Odpowiedz

5

Dzięki Josh - w moim przypadku mam to działa teraz poprzez

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

gdzie znalazłem właściwą linię do wstawienia mój zmodyfikowanego kodu przy użyciu

as.list(body(xcmsRaw)) 

w celu wyeliminowania śladowych ilości wyjściowego następnie określono drugą funkcję

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

który może być wywołanym i który nie zapewnia żadnego niepotrzebnego wyniku śledzenia.

Nadal byłoby miło, gdyby działało to również poprzez assignInNamespace(), ponieważ pozwoliłoby to na bardziej rozbudowane edycje/redefinicje, a także na zmiany w argumentach funkcji (co byłoby częstym powodem do przedefiniowania funkcji, to jest , aby wziąć dodatkowy argument) ...

+0

Świetnie! Zgadzam się, to wygląda jak włamanie, ale jego prawdopodobieństwo. o wiele lepiej niż nic, dopóki nie trafisz na bardziej elastyczne/eleganckie rozwiązanie. –

+0

Tak, to prawda - jeszcze raz dziękuję za poświęcony czas i pomoc! –

+0

O tak, i czy istnieje jakiś sposób, aby powstrzymać wyjście śladu? Teraz za każdym razem, gdy wywołuję xcmsRaw, wypisuję "Tracing xcmsRaw (files [samplenr], profstep = profst, profmethod =" bin ", .... step 6" - ale chciałbym wyłączyć to wyjście. Czy jest jakiś sposób zrób to? –

Powiązane problemy