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