我试图找到一些代码中使用的功能集。
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))
这似乎有效,但是太长而且不易读取 是否有更优雅的方法来确定某些函数中出现哪一组函数?
答案 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的解析器。此外,也可以找到没有括号的函数(例如,:
)。