重新定义R包中的函数

Tom*_*ers 9 r function redefine package

我试图通过首先定义一个函数来修改和重新定义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) { ... }
Run Code Online (Sandbox Code Playgroud)

然后输入

unlockBinding("xcmsRaw", as.environment("package:xcms"))
assign("xcmsRaw", my.xcmsRaw, as.environment("package:xcms"))
lockBinding("xcmsRaw", as.environment("package:xcms"))
Run Code Online (Sandbox Code Playgroud)

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

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

由于它没有找到profBinM函数,这是一个在xcms包的文件xcms.c中定义的C代码函数.

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

Tom*_*ers 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))
Run Code Online (Sandbox Code Playgroud)

我找到了正确的行来插入我修改过的代码

as.list(body(xcmsRaw))
Run Code Online (Sandbox Code Playgroud)

为了抑制跟踪I的输出,然后定义了第二个函数

xcmsRaw2=function(...) {sink("NUL");obj=xcmsRaw(...);sink();return(obj) }
Run Code Online (Sandbox Code Playgroud)

哪个可以被调用,哪个不提供任何不必要的跟踪输出.

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