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

时间:2015-01-15 13:50:26

标签: 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 

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

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

  • 使用parse(text = ...)将字符串转换为表达式
  • 使用包call_tree()中的pryr来构建调用树
  • 使用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