分析脚本中 R 函数调用的调用树

Analyse call tree for R functions call in scripts

我正在寻找一种方法来以编程方式分析(和操作)我在 R 脚本中的函数调用的调用树。我了解到在 pryr 包中,有一个函数 pryr::ast() 其中 returns 调用的层次树结构。我想要类似的东西,但正如我提到的,它需要处理字符串输入:

例如,请考虑以下示例文件 input.R 的内容,该文件位于我的硬盘上:

mean(sqrt(1:10 - 1), na.rm = T, trim = 0.1)

任务是将 input.R 读入 R,然后基本上遍历脚本并以某种列表形式收集嵌套函数调用,例如pryr 打印这个:

\- ()
 \- `mean
 \- ()
   \- `sqrt
   \- ()
     \- `-
     \- ()
       \- `:
       \-  1
       \-  10
     \-  1
  \- `T
  \-  0.1 

是否有一些优雅的方法可以做到这一点,或者我是否必须使用某种形式的正则表达式来识别调用?

尝试以下操作:

  • 使用 parse(text = ...) 将字符串转换为表达式
  • 使用包 pryr 中的 call_tree() 构建调用树
  • 使用 capture.outputstdout 中的结果抓取到列表中

例如:

library(pryr)
f <- "mean(sqrt(1:10 - 1), na.rm = T, trim = 0.1)"
x <- capture.output(call_tree(parse(text=f)))

您的结果是一个字符向量(即列表)

x
 [1] "\- ()"          "  \- `mean"     "  \- ()"        "    \- `sqrt"   "    \- ()"     
 [6] "      \- `-"    "      \- ()"    "        \- `:"  "        \-  1"  "        \-  10"
[11] "      \-  1"    "  \- `T"        "  \-  0.1 "    

str(x)
 chr [1:13] "\- ()" "  \- `mean" "  \- ()" "    \- `sqrt" "    \- ()" ...

cat(x, sep="\n")
\- ()
  \- `mean
  \- ()
    \- `sqrt
    \- ()
      \- `-
      \- ()
        \- `:
        \-  1
        \-  10
      \-  1
  \- `T
  \-  0.1