我正在寻找一种以编程方式分析(和操作)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
是否有一些优雅的方法可以做到这一点,还是我必须使用某种形式的正则表达式来识别呼叫?
答案 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