9

我试图通过首先定义一个函数来修改和重新定义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)

4

1 回答 1

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() 让它工作仍然会很好,因为这将允许更广泛的编辑/重新定义以及函数参数的更改(这将是重新定义函数的常见原因,即采取一些额外的论点)...

于 2013-05-01T13:17:17.673 回答