2017-08-15 135 views
1

我试图找到哪些函数在某些代码中被使用。确定哪些函数在代码中

  • 以为他们会一直跟着开口支架
  • 循环正则表达式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)) 

这似乎工作,但太长,不太可读的人。
有没有一种更优雅的方式来确定哪些功能出现在某些代码中?

回答

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解析器。此外,也可以找到没有括号的函数(例如,:)。

相关问题