如何开发R静态分析工具区分同名函数与变量以修正依赖图?
R静态分析工具开发需求:区分同名函数与变量
核心问题
给定以下代码:
f1 <- function() { 1 } f2 <- function() { f1 <- 10 2 }
能否编写一款可集成到R包(支持R或C/C++实现)的静态分析工具,通过代码分析判定函数f1()与变量f1是不同对象?
背景说明
该问题源于我开发的foodwebr包的遗留问题:包的功能是生成指定环境中函数的依赖关系图,但当前实现会错误地在f2()与f1()之间建立依赖边,根源是无法区分f2内部定义的变量f1和外部全局环境中的函数f1()。
我已尝试过以下方案:
- 参考R调用图生成的相关实现思路
- 基于mvbutils包实现(当前包的实现参考来源)
- 研究CodeDepends包,但源码阅读难度大,且该包已弃用
- 测试pkgdepR包,但它仅支持分析包内函数依赖
- 考虑使用lobstr包,但不清楚具体实现路径
当前基于mvbutils的实现逻辑是将函数的body()转换为文本,匹配已知函数名,这种方法在多数场景下有效,但在上述示例中会失效。
R具备代码自省能力,我认为该问题可解,但暂未找到可行思路,恳请提供方向指引!
问题复现代码
install.packages("remotes") remotes::install_github("lewinfox/foodwebr") library(foodwebr) f1 <- function() { 1 } f2 <- function() { f1 <- 10 # 此变量`f1`会被误判为函数`f1()` 2 } # foodweb错误认为函数`f2()`调用了函数`f1()` foodweb() #> # A `foodweb`: 2 vertices and 1 edge #> digraph 'foodweb' { #> f1() #> f2() -> { f1() } #> }
期望输出
foodweb()的期望输出应为:
#> # A `foodweb`: 2 vertices and 0 edges #> digraph 'foodweb' { #> f1() #> f2() #> }
内容的提问来源于stack exchange,提问作者Lewin
相关产品推荐
相关产品推荐

