如何调试R包中的隐藏函数?以SteinerNet包steinertree3为例
调试R包中隐藏内部函数的正确方法
调用SteinerNet包的steinertree函数时出现错误,通过debug(steinertree)调试定位到错误出在该函数对steinertree3的调用环节,但直接执行debug(steinertree3)或输入函数名查看代码时,会提示“object 'steinertree3' not found”。即便后续在CRAN的包源码文件steinertree.R中找到该函数,仍需掌握调试这类R包隐藏函数的标准方法。
示例代码:
library(igraph) library(SteinerNet) set.seed(1) g= erdos.renyi.game(n=10,p.or.m=0.2) plot(g) steinertree(type= 'KB', terminals= c(1,3), graph= g)
调试R包未导出内部函数的方法:
- 直接访问内部函数:R包未导出的内部函数不会暴露在全局环境,需使用
包名:::函数名的语法访问。比如调试steinertree3,执行debug(SteinerNet:::steinertree3);查看函数代码直接输入SteinerNet:::steinertree3即可。注意是三个冒号,两个冒号仅用于访问包的导出函数。 - 查看包内所有函数:执行
ls(getNamespace("SteinerNet"))可列出该包命名空间下的全部函数(包括未导出的),能快速确认内部函数的名称和存在性。 - 基于源码调试:若需深入分析函数上下文,可下载包的源码,打开对应R文件直接分析逻辑,也可临时将内部函数复制到全局环境调试,但需注意该函数可能依赖包内其他未导出对象,需同步处理。
- 用
trace函数跟踪:无需手动开启debug,执行trace(SteinerNet:::steinertree3, browser)可在函数执行时自动触发浏览器调试环境,快速进入函数内部排查问题。
内容的提问来源于stack exchange,提问作者M. Plank
相关产品推荐
相关产品推荐

