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

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

作为示例,请考虑以下示例文件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.output将stdout中的结果抓取到列表中

例如:

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 
点赞