2013-05-01 73 views
7

我試圖修改和通過首先定義一個函數重新定義的函數在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) { ... } 

然後鍵入

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

然而,當重新定義中的R包。LCMS一個函數(xcmsRaw)我運行它,它給我造成它沒有找到profBinM功能,這是一個C代碼本功能的錯誤

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

在xcms軟件包的文件xcms.c中定義。

有關如何解決此問題的任何想法? (我的工作在Windows 7下,,使用R版本3.0.0)

+0

您是否嘗試過'assignInNamespace()',例如[this example](http://stackoverflow.com/questions/15505607/diagonal-labels-orientation-上x軸合熱圖/ 15506652#15506652)?在你的情況下,你會使用'assignInNamespace(x =「xcmsRaw」,value =「my.xcmsRaw」,ns = asNamespace(「xcms」))''。 – 2013-05-01 12:18:33

+0

感謝您的建議,只是試過,但它仍然給我同樣的錯誤不幸... – 2013-05-01 12:21:16

+0

有趣的。只是要精確/清楚,'profBinM()'是一個R函數包裝一個C函數。 – 2013-05-01 12:30:41

回答

5

感謝約什 - 在我的情況下,我得到了它現在可以通過

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

工作在那裏我找到了正確的路線使用插入我的修改後的代碼

as.list(body(xcmsRaw)) 

爲了抑制然後我限定的第二函數

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

跡線的輸出,可被調用並且不提供任何不必要的跟蹤輸出。

儘管如此,通過assignInNamespace()也可以很好地工作,因爲這樣可以實現更廣泛的編輯/重定義以及函數參數的更改(這將是重新定義函數的常見原因,即,採取一些額外的論據)...

+0

太棒了!我同意,這感覺像一個黑客,但它的概率。直到你找到更靈活/優雅的解決方案之前,它總比沒有好。 – 2013-05-01 13:18:22

+0

是的,這是對的 - 再次感謝您的時間和幫助! – 2013-05-01 13:19:35

+0

哦,是的,是否有任何方法可以抑制跟蹤輸出?現在每次我調用xcmsRaw時,它都會打印出「跟蹤xcmsRaw(文件[samplenr],profstep = profst,profmethod =」bin「,....步驟6」 - 但是我想要抑制這個輸出。這樣做? – 2013-05-02 11:36:17