2013-05-01 72 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