确定代码中的哪些函数

时间:2017-08-15 10:41:39

标签: r regex

我试图找到一些代码中使用的功能集。

  • 假设他们将始终跟着一个左括号
  • 在函数名称
  • 上循环正则表达式grepl("someFunction\\(", code)
  • 指定在函数名称前面必须包含除字母,下划线或点之外的其他内容,因此frame中找不到data.frame(...)。使用以下正则表达式可以实现此目的:grepl("[^a-zA-Z_\\.]someFunction\\(", code)
  • 通过在代码前加上空格
  • ,确保仍然可以找到代码开头的函数名称
  • 使用\\.gsub(".","\\.",theFunctions, fixed=TRUE)
  • 替换函数名称中的点

这是一个可重复性最小的测试:

code <- "mean(pi); head(data.frame(A=1:5)); data_frame(7:9)"
funs <- c("mean", "head", "head.data.frame",  "data.frame", "frame", "data_frame")

data.frame(isfound=sapply(paste0("[^a-zA-Z_\\.]",gsub(".","\\.",funs,fixed=TRUE),"\\("), 
                          grepl, x=paste0(" ",code)),
           shouldbefound=c(T,T,F,T,F,T))

这似乎有效,但是太长而且不易读取 是否有更优雅的方法来确定某些函数中出现哪一组函数?

1 个答案:

答案 0 :(得分:2)

您可以使用以下方法查找R代码中使用的函数的名称。函数get_functions可以与表示为字符串的代码一起使用。

get_functions <- function(code) {
  unname(find_functions(parse(text = code)))
}

find_functions <- function(x, y = vector(mode = "character", length = 0)) {
  if (is.symbol(x)) {
    if (is.function(eval(x)))
      c(y, as.character(x))
  } else {
    if (!is.language(x)) {
      NULL
    } else {
      c(y, unlist(lapply(x, find_functions)))
    }
  }
}

这里,find_functions是递归调用的,因为表达式可以嵌套。

一个例子:

code <- "mean(pi); head(data.frame(A=1:5)); data_frame(7:9)\n paste(\"ABC\", 0x28)"

get_functions(code)
# [1] "mean"       "head"       "data.frame" ":"          "data_frame" ":"          "paste"

这种方法似乎更安全,因为它使用了R的解析器。此外,也可以找到没有括号的函数(例如,:)。