这是我第一次尝试此操作,因此如果我弄错了术语,我们深表歉意。我正在使用一个软件包(生物导体上的snapCGH)。我调用了一个函数plotSegmentedGenome,该函数又调用了基因组图。这两个函数都在snapCGH命名空间中:
> environment(plotSegmentedGenome)
<environment: namespace:snapCGH>
> environment(genomePlot)
<environment: namespace:snapCGH>
Run Code Online (Sandbox Code Playgroud)
我想修改基因组图。我的第一次尝试是简单地运行
> genomePlot
Run Code Online (Sandbox Code Playgroud)
因此,我可以获取代码并从中创建一个新函数。我想更改两件小事。它以mb为单位标记x轴,而Id则以bp为单位标记(因此要乘以标签,但所绘制的值将不乘以1000000)。其次,它用令人讨厌的红色染色体标记了x轴。我想完全删除该标签。将此尝试另存为基因组图.R并获得了它。
如果然后运行plotSegmentedGenome,则没有任何变化。因此,我认为它仍在其命名空间中使用基因组绘图功能。如果在全局环境中创建自己的plotSegmentedGenome副本,则会收到错误“错误:找不到对象'chrominfo.Mb'”。这是plotSegmentedGenome的参数之一,我想是在环境中创建的。
我希望这是有道理的,并且有一个解决方案并不容易:)
ps:我在http://www.r-bloggers.com/environments-in-r/上阅读了此内容,虽然很有趣,但不够详尽,无法让我找出解决方法。如果我能写
snapCGH$genomePlot <- customGenomePlot
or
snapCGH:::genomePlot <- customGenomePlot
Run Code Online (Sandbox Code Playgroud)
更新:基于包函数内的重定向/拦截函数调用
我试过了
library(proto)
plotSegmentedGenome <- with(proto(environment( plotSegmentedGenome), plotSegmentedGenome = snapCGH:: plotSegmentedGenome, genomePlot = genomePlot), my_genomePlot)
Run Code Online (Sandbox Code Playgroud)
但是我仍然收到错误
Error in plotSegmentedGenome(SegInfo.Hom.runDNAcopy, array = array, chrom.to.plot = 19, :
object 'chrominfo.Mb' not found
>
Run Code Online (Sandbox Code Playgroud)
它至少正在调用该函数的版本,因为它会打印我卡在my_genomePlot中的消息(“它还活着!”)。
TMS*_*TMS 29
我终于找到了一个适用于所有情况的解决方案!
environment(customGenomePlot) <- asNamespace('snapCGH')
assignInNamespace("genomePlot", customGenomePlot, ns = "snapCGH")
Run Code Online (Sandbox Code Playgroud)
调用environment()确保函数能够从包中调用其他隐藏函数。
调用assignInNamespace()确保包中的其他函数将调用该函数的更新版本。
在某些情况下,您可能只需要其中之一,但通常两者都需要。我努力找到这个通用解决方案,发现许多其他在某些情况下不起作用,比如这个(需要相反的顺序),或者这个(错过第二部分),或者这个(抛出错误“无法将绑定添加到锁定环境”)。
您要永久编辑功能吗?还是只是暂时的?
如果要进行永久更改,则应获取该软件包的源版本,修改源代码,然后从更改后的源中安装该软件包。还可以考虑将所做的更改返回给作者/维护者。
如果要临时更改,请尝试以下命令:
trace(genomePlot, edit=TRUE)
Run Code Online (Sandbox Code Playgroud)
这将打开一个带有源代码的编辑器(如果您不想使用默认值,也可以指定哪个编辑器)并进行编辑。当您保存并退出编辑器时,它将保存您编辑过的版本,而不是原来的版本,同时要注意环境/命名空间/ etc。
此更改将仅在当前R会话中持续,或者直到您调用该untrace函数为止。