You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何开发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:45:56