假设我有一个名为的函数Fun1,我在其中使用R的许多不同的内置函数用于不同的不同进程.然后,我如何获得此函数中使用的内置函数列表Fun1
Fun1 <- function(x,y){
sum(x,y)
mean(x,y)
c(x,y)
print(x)
print(y)
}
Run Code Online (Sandbox Code Playgroud)
所以我的输出应该是这样的,即人物的名单sum,mean,c,print.因为这些是我在函数内部使用的内置函数Fun1.
我尝试过使用grep功能
grep("\\(",body(Fun1),value=TRUE)
# [1] "sum(x, y)" "mean(x, y)" "c(x, y)" "print(x)" "print(y)"
Run Code Online (Sandbox Code Playgroud)
它看起来不错,但论据不应该来,即x和y.这里只是函数体内使用的函数名列表Fun1.
所以我的总体目标是在unique list of in-built functions or any create functions inside a particular function这里打印Fun1.
对此的任何帮助都非常感谢.谢谢.
您可以使用all.vars()获取出现在主体内部的所有变量名称(包括函数)Fun1,然后将其与一些准备好的函数列表进行比较.你提到了内置函数,所以我将它与基础包对象名称进行比较.
## full list of variable names inside the function body
(vars <- all.vars(body(Fun1)[-1], functions = TRUE))
# [1] "sum" "x" "y" "mean" "c" "print"
## compare it with the base package object names
intersect(vars, ls(baseenv()))
# [1] "sum" "mean" "c" "print"
Run Code Online (Sandbox Code Playgroud)
我删除了函数体的第一个元素,因为大概你不关心{,它可能与基础包列表匹配.
另一种可能性,虽然可靠性稍差,但可以比较函数中Fun1所有变量名的形式参数.就像我说的那样,可能不太可靠,但是如果你在函数内部进行分配,你最终会得到不正确的结果.
setdiff(vars, names(formals(Fun1)))
# [1] "sum" "mean" "c" "print"
Run Code Online (Sandbox Code Playgroud)
这些都很有趣,你可以随意使用它们.
可以使用 中的函数访问解析器标记utils。
tokens <- utils::getParseData(parse(text=deparse(body(Fun1))))
unique(tokens[tokens[["token"]] == "SYMBOL_FUNCTION_CALL", "text"])
[1] "sum" "mean" "c" "print"
Run Code Online (Sandbox Code Playgroud)