这是我第一次尝试这个,所以如果我的术语出错了,请道歉。我使用的是一个包(biConductor上的snapCGH)。我调用了一个函数plotSegmentedGenome,后者又调用了GeneticPlot。这两个函数都在snapCGH命名空间内:
> environment(plotSegmentedGenome)
<environment: namespace:snapCGH>
> environment(genomePlot)
<environment: namespace:snapCGH>
我想编辑genomePlot。我的第一次尝试包括简单地运行
> genomePlot
所以我可以从中获取代码并创建一个新函数。我想改变的两件小事。它以mb标记x轴,而Id标记为bp(因此将标签相乘但没有绘制1000000的值)。其次,它将x轴另外用染色体标记为刺耳的红色。我想完全删除该标签。将此尝试保存为genomePlot.R并获取它。
如果我然后运行plotSegmentedGenome,则没有任何变化。所以我认为它仍然在其命名空间中使用了hte genomePlot函数。如果我在全局环境中创建自己的plotSegmentedGenome副本,那么我会收到错误“错误:找不到对象'chrominfo.Mb'”。这是plotSegmentedGenome的一个参数,我想这是在env中创建的。
我希望这是有道理的,并且有一个非常简单的解决方案:)
ps:我读过这个,http://www.r-bloggers.com/environments-in-r/,这很有意思但不够详细,让我弄明白如何解决这个问题。如果我能写的话
snapCGH$genomePlot <- customGenomePlot
or
snapCGH:::genomePlot <- customGenomePlot
更新: 基于Redirect/intercept function calls within a package function
我试过
library(proto)
plotSegmentedGenome <- with(proto(environment( plotSegmentedGenome), plotSegmentedGenome = snapCGH:: plotSegmentedGenome, genomePlot = genomePlot), my_genomePlot)
但我仍然收到错误
Error in plotSegmentedGenome(SegInfo.Hom.runDNAcopy, array = array, chrom.to.plot = 19, :
object 'chrominfo.Mb' not found
>
它至少调用我的函数版本,因为它打印消息(“它活着!”)我卡在my_genomePlot
答案 0 :(得分:4)
您想永久编辑该功能吗?还是暂时的?
如果您想要永久更改,那么您应该获得该软件包的源版本,修改源代码,然后从更改的源安装软件包。还要考虑将更改贡献给作者/维护者。
如果您想要临时更改,请尝试以下命令:
trace(genomePlot, edit=TRUE)
这将打开一个编辑器(您也可以指定哪个编辑器,如果您不想使用默认值)和源代码,并允许您编辑它。当您保存并退出编辑器时,它将保存您编辑的版本,而不是原始的环境/命名空间/等。
此更改仅会持续当前的R会话或直到您调用untrace
函数。
答案 1 :(得分:4)
我终于找到了一种在所有情况下都可以使用的解决方案!
environment(customGenomePlot) <- asNamespace('snapCGH')
assignInNamespace("genomePlot", customGenomePlot, ns = "snapCGH")
对environment()
的调用可确保该函数将能够调用程序包中的其他隐藏函数。
对assignInNamespace()
的调用可确保软件包中的其他功能将调用该功能的更新版本。
在某些情况下,您可能只需要其中之一,但通常都需要两者。我很难找到这种通用解决方案,发现许多其他在某些情况下不起作用的解决方案,例如this(需要相反的顺序)或this(缺少第二部分)或this (引发错误“无法将绑定添加到锁定的环境”)。
答案 2 :(得分:2)
尝试这样的事情:
library(snapCGH)
my.genomePlot <- function (...)
{
## your custom code goes here
message("in my genomePlot")
}
unlockBinding("genomePlot", as.environment("package:snapCGH"))
assign("genomePlot ", my.genomePlot , as.environment("package:snapCGH"))
lockBinding("genomePlot ", as.environment("package:snapCGH"))