分析脚本中 R 函数调用的调用树
Analyse call tree for R functions call in scripts
我正在寻找一种方法来以编程方式分析(和操作)我在 R 脚本中的函数调用的调用树。我了解到在 pryr 包中,有一个函数 pryr::ast() 其中 returns 调用的层次树结构。我想要类似的东西,但正如我提到的,它需要处理字符串输入:
例如,请考虑以下示例文件 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
我正在寻找一种方法来以编程方式分析(和操作)我在 R 脚本中的函数调用的调用树。我了解到在 pryr 包中,有一个函数 pryr::ast() 其中 returns 调用的层次树结构。我想要类似的东西,但正如我提到的,它需要处理字符串输入:
例如,请考虑以下示例文件 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