如何获取函数中使用的内置函数列表

Sow*_*ian 4 r function

假设我有一个名为的函数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)

它看起来不错,但论据不应该来,即xy.这里只是函数体内使用的函数名列表Fun1.

所以我的总体目标是在unique list of in-built functions or any create functions inside a particular function这里打印Fun1.

对此的任何帮助都非常感谢.谢谢.

Ric*_*ven 6

您可以使用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)

这些都很有趣,你可以随意使用它们.


pic*_*ick 5

可以使用 中的函数访问解析器标记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)