抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

SylensHub

吃饭, 睡觉, 打游戏!

短时间内,我碰到两次需要修复R函数Bug的情况了,也顺便学习了一下如何进行热替换…

为什么需要热修复?

在数据分析项目中,时间往往是关键因素。如果依赖的R包函数存在bug,可能会阻塞整个分析流程。虽然说向包维护者报告bug并帮助修复是最能回馈开源社区的方式,但是… 其实你总不可能跟老板说,我已经跟作者反馈Bug了,猴年马月之后,我们就能等到正确结果啦!

所以自己找到问题,并进行热修复更实际一些。

最基本的修复–替换

据我这些年的使用经验,R虽然支持对象,但是真这么用的并不多,至少大多数生物信息的包还是函数式的,因此,最简单的思路,哪个函数出问题,用修改后的函数替换就是。

首先,我们可以定位到要修复的函数,然后print(YOUR_FUNCTION),这样就能得到你目前工作环境中,对应函数的代码了。

当然,有些时候我们要修复的函数并不是包内导出的给用户使用的函数,可能是包的内部函数,这时需要用包名+:::+函数名来获得代码。

在对函数做了修改之后,直接<-盖掉原来的函数,就能完成修改了。比如我给Azimuth那个问题的方案,就是直接改函数这么替换。

修改函数后,进行命名空间设置

当然大部分函数并不能真像上面那样那么简单就完成修复,因为大多数函数不是孤立的,它可能要在原包内调用其他函数,也可能它是一个不导出的内置函数,这样子在当前命名空间下完成替换,并不能起效,还要替换对应包命名空间下的原函数,步骤如下:

R提供了assignInNamespace函数,允许我们替换包命名空间中的对象。

  1. assignInNamespace设置函数的环境为包的命名空间
  2. 将修改后的函数赋值回包的命名空间

实际操作起来很简单:

1
2
3
4
5
6
7
8
9
10
# 写好修改的函数
createOncoMatrix <- function(
print('Mod!')
)

# 设置函数环境为包的命名空间
environment(createOncoMatrix) <- asNamespace("maftools")

# 将修改后的函数替换回包的命名空间
assignInNamespace("createOncoMatrix", createOncoMatrix, ns = "maftools")

后记

虽然记录了热修复方案,单我还是更希望,不要再让我遇上这种问题了… 30分钟的分析变成一下午的Debug…

评论

留下友善的评论吧~