提取有关 R 脚本中函数和包使用情况的信息

Extract information on usage of functions and packages in R scripts

提问人:henfiber 提问时间:10/11/2015 更新时间:10/11/2015 访问量:474

问:

在一个或多个 R 脚本中提取函数调用及其出现的行的正确方法是什么?是否有解析基本函数或包允许我执行此操作,或者我应该使用正则表达式构建解决方案?

例如:

function_calls("project1/exploratory_analysis.R")

应该输出一个数据帧,如:

##    function  line                filename
## 1    tapply    35  exploratory_analysis.R
## 2     qplot    80  exploratory_analysis.R

最后,我想要实现的是构建一个或多个 R 脚本中使用的函数调用和加载包的反向索引,用于教育和参考目的。 (例如,用作带有使用示例的存储库)。例如:

--------------------------------------------------------    
| function |       source_file      | line  |  package |
|:--------:|:----------------------:|:-----:|:--------:|
|  tapply  | exploratory_analysis.R |   35  |   base   |
|   qplot  | exploratory_analysis.R |   80  |  ggplot2 |
|    cor   |      regression.R      |   15  |   stats  |
|    cor   |      regression.R      |   27  |   stats  |
|  tapply  |      regression.R      |   12  |   base   |
| fromJSON |     load_dataset.R     |   5   | jsonlite |
|    %>%   |    transformation.R    |   10  | magrittr |
--------------------------------------------------------

可以使用一些正则表达式来提取函数调用,但我想知道是否存在支持此任务的解析、静态代码分析或反射工具。

我想组合 、 、 、 (或者可能是包中的函数 )会使它成为可能,但我对它们的用法不够熟悉,无法自己弄清楚。parse()substitute()getParseData()deParse()srcfile()mvbutilscodetools

r 解析 反射 静态分析

评论

0赞 Roland 10/11/2015
您是在谈论对函数的显式调用,还是包括隐式调用(即调用堆栈)。您是否将包含诸如 或 ?<-if*
0赞 henfiber 10/11/2015
@Roland 我最感兴趣的是显式调用,因为这些是大多数最终用户想要学习如何使用的调用。关于运算符,我最感兴趣的是自定义运算符,例如 / 中定义的管道运算符。%>%magrittrdplyr
3赞 henfiber 10/12/2015
我刚刚发现,它生成了一个包含所有标记、它们的类型(符号、function_call、表达式等)和它们的出现线。更具体地说,将上述 data.frame 子集化为仅保留函数调用。 可用于仅保留特殊运算符,如 或 。如果没有人提出更好的解决方案,我会将其作为任何感兴趣的人的答案发布。getParseData(parse("some_script.R"))data.framesubset(getParseData(parse("some_script.R")), token == "SYMBOL_FUNCTION_CALL")token == "SPECIAL"%in%%>%
0赞 Bryan Shalloway 1/10/2022
那么你如何把它和包装联系起来呢?

答: 暂无答案