短时间内,我碰到两次需要修复R函数Bug的情况了,也顺便学习了一下如何进行热替换…
为什么需要热修复?
在数据分析项目中,时间往往是关键因素。如果依赖的R包函数存在bug,可能会阻塞整个分析流程。虽然说向包维护者报告bug并帮助修复是最能回馈开源社区的方式,但是… 其实你总不可能跟老板说,我已经跟作者反馈Bug了,猴年马月之后,我们就能等到正确结果啦!
所以自己找到问题,并进行热修复更实际一些。
最基本的修复–替换
据我这些年的使用经验,R虽然支持对象,但是真这么用的并不多,至少大多数生物信息的包还是函数式的,因此,最简单的思路,哪个函数出问题,用修改后的函数替换就是。
首先,我们可以定位到要修复的函数,然后print(YOUR_FUNCTION),这样就能得到你目前工作环境中,对应函数的代码了。
当然,有些时候我们要修复的函数并不是包内导出的给用户使用的函数,可能是包的内部函数,这时需要用包名+:::+函数名来获得代码。
在对函数做了修改之后,直接<-盖掉原来的函数,就能完成修改了。比如我给Azimuth那个问题的方案,就是直接改函数这么替换。
修改函数后,进行命名空间设置
当然大部分函数并不能真像上面那样那么简单就完成修复,因为大多数函数不是孤立的,它可能要在原包内调用其他函数,也可能它是一个不导出的内置函数,这样子在当前命名空间下完成替换,并不能起效,还要替换对应包命名空间下的原函数,步骤如下:
R提供了assignInNamespace函数,允许我们替换包命名空间中的对象。
- 用
assignInNamespace设置函数的环境为包的命名空间 - 将修改后的函数赋值回包的命名空间
实际操作起来很简单:
1 | # 写好修改的函数 |
后记
虽然记录了热修复方案,单我还是更希望,不要再让我遇上这种问题了… 30分钟的分析变成一下午的Debug…