我正在尝试查找任意合法 R 表达式中使用的所有函数的名称,但我找不到将以下示例标记为函数而不是名称的函数。
test <- expression(
this_is_a_function <- function(var1, var2){
this_is_a_function(var1-1, var2)
})
all.vars(test, functions = FALSE)
[1] "this_is_a_function" "var1" "var2"
all.vars(expr, functions = FALSE) 似乎在表达式中返回函数声明 (f <- function(){}),同时过滤掉函数调用 ('+'(1,2), ...)。
是否有任何函数 - 在核心库或其他地方 - 会将“this_is_a_function”标记为函数,而不是名称?它需要处理语法上合法但可能无法正确计算的任意表达式(例如,'+'(1, 'duck'))
我发现了类似的问题,但它们似乎不包含解决方案。
如果需要澄清,请在下面发表评论。我正在使用解析器包来解析表达式。
编辑:@哈德利
我的表达式包含整个脚本,通常由一个包含嵌套函数定义的主函数组成,并在脚本末尾调用主函数。
函数都是在表达式中定义的,我不介意是否必须包含'<-'和'{',因为我可以很容易地自己过滤掉它们。
这样做的动机是获取我所有的 R 脚本并收集关于我对函数的使用如何随时间变化的基本统计数据。
编辑:当前解决方案
基于正则表达式的方法获取函数定义,并结合 James 注释中的方法来获取函数调用。通常有效,因为我从不使用右手分配。
function_usage <- function(code_string){
# takes a script, extracts function definitions
require(stringr)
code_string <- str_replace(code_string, 'expression\\(', '')
equal_assign <- '.+[ \n]+<-[ \n]+function'
arrow_assign <- '.+[ \n]+=[ \n]+function'
function_names <- sapply(
strsplit(
str_match(code_string, equal_assign), split = '[ \n]+<-'),
function(x) x[1])
function_names <- c(function_names, sapply(
strsplit(
str_match(code_string, arrow_assign), split = '[ \n]+='),
function(x) x[1]))
return(table(function_names))
}