重新定义R包中的函数

时间:2013-05-01 11:57:42

标签: r function package redefine

我尝试通过首先定义一个函数来修改和重新定义R包xcms中的函数(xcmsRaw)

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

但是,当我运行它时,它会给我错误

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'profBinM' of mode 'function' was not found
由于没有找到profBinM函数而导致

,这是一个在xcms包的文件xcms.c中定义的C代码函数。

有关如何解决此问题的任何想法? (我在Windows 7下工作,使用R版本3.0.0)

1 个答案:

答案 0 :(得分:5)

谢谢Josh - 就我而言,我现在通过

开始工作了
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))

要抑制跟踪I的输出,则定义第二个函数

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

可以被调用,但不提供任何不必要的跟踪输出。

通过assignInNamespace()也可以很好地使它工作,因为这将允许更广泛的编辑/重新定义以及函数参数的更改(这将是重新定义函数的常见原因,即,采取一些额外的论点)......