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

分析R函数在脚本中的调用树,r,R,我正在寻找一种以编程方式分析(和操纵)R脚本中函数调用的调用树的方法。我了解到在pryr包中有一个函数pryr::ast(),它返回调用的层次树结构。我想要类似的东西,但正如我提到的,它需要处理字符串输入: 作为一个例子,考虑下面的示例文件输入> r>强>,这是在我的硬盘上: mean(sqrt(1:10 - 1), na.rm = T, trim = 0.1) 任务是将input.R读入R,然后遍历脚本并以某种形式的列表收集嵌套函数调用,例如,pryr打印以下内容: \- () \- `m

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

作为一个例子,考虑下面的示例文件<强>输入> 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)))

您看到的是一个解析树,而不是调用树。调用树是不同的(尽管相关)。另外,既然你显然知道普赖尔,那么这个问题到底是关于什么的呢?谢谢你的更正。事实上,我不得不承认,即使是哈德利的“高级R”教程也犯了这个错误,并使用了“调用树”这个术语。甚至我的评论也有点错误:一般术语是“语法树”,其中“parse tree”在很大程度上是同义词,但这种用法在解析器的上下文之外听起来很奇怪(为了说明这一点,
call的结果(+),引号(a),1)
是一个语法树,但由于它没有被解析——而是由函数调用构建的——术语“解析树”在这里可能会很奇怪。)@KonradRudolph,但从这个问题上我并不清楚。我当然不知道如何使用
字符串作为输入来获得这个结果。
ast()
中的示例仅演示如何使用表达式而不是字符串来实现这一点。pryr主要(独占地)作为对的补充而存在。在那里,解析是在AST操作之前直接解释的。这对我很有用。我不知道call_tree/capture.output,但输出是我想要的。我对此也很感兴趣,但我更愿意使用嵌套列表或
igraph
对象,而不是打印文本。我不确定我是否能很好地解析它。
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