编辑包名称空间中的函数

时间:2014-06-20 16:22:17

标签: r

这是我第一次尝试这个,所以如果我的术语出错了,请道歉。我使用的是一个包(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

3 个答案:

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