我正在寻找一种方法来编程分析(和操作)我在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