如何获取函数

时间:2016-09-13 07:16:05

标签: r function

假设我有一个名为Fun1的函数,我在其中使用R的许多不同的内置函数用于不同的不同进程。然后,我如何获得此函数Fun1

中使用的内置函数列表
  Fun1 <- function(x,y){
  sum(x,y)
  mean(x,y)
  c(x,y)
  print(x)
  print(y)
  }

所以我的输出应该像字符列表,即summeancprint。因为这些是我在函数Fun1中使用的内置函数。

我尝试过使用grep功能

 grep("\\(",body(Fun1),value=TRUE)
 # [1] "sum(x, y)"  "mean(x, y)" "c(x, y)"    "print(x)"   "print(y)" 

看起来没问题,但参数不应该是xy。这里只是函数体Fun1体内使用的函数名列表。

所以我的总体目标是打印unique list of in-built functions or any create functions inside a particular functionFun1

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

5 个答案:

答案 0 :(得分: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"

我删除了函数体的第一个元素,因为大概你不关心{,它会与基础包列表匹配。

另一种可能性,虽然可靠性稍差,但是将Fun1的形式参数与函数中的所有变量名称进行比较。就像我说的那样,可能不太可靠,但是如果你在函数内部进行分配,你最终会得到不正确的结果。

setdiff(vars, names(formals(Fun1)))
# [1] "sum"   "mean"  "c"     "print"

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

答案 1 :(得分:4)

utils的函数可以访问解析器令牌。

tokens <- utils::getParseData(parse(text=deparse(body(Fun1))))
unique(tokens[tokens[["token"]] == "SYMBOL_FUNCTION_CALL", "text"])
[1] "sum"   "mean"  "c"     "print"

答案 2 :(得分:2)

这应该会有所帮助 - 但这将返回所有功能。

func_list = Fun1 %>% 
  body() %>% # extracts function
  toString() %>% # converts to single string
  gsub("[{}]", "", .)  %>% # removes curly braces
  gsub("\\s*\\([^\\)]+\\)", "", .) %>% # removes all contents between brackets
  strsplit(",") %>% # splits strings at commas
  unlist() %>% # converts to vector
  trimws(., "both") # removes all white spaces before and after`

[1] "" "sum" "mean" "c" "print" "print"

> table(func_list)
func_list
          c  mean print   sum 
    1     1     1     2     1 

这非常受限于您的示例...您可以将其修改为更强大。它将落在函数具有嵌套其他函数等的括号的位置。

答案 3 :(得分:1)

这不是那么美丽但是有效:

Fun1 <- function(x,y){
    sum(x,y)
    mean(x,y)
    c(x,y)
    print(x)
    print(y)
}


getFNamesInFunction <- function(f.name){
    f <- deparse(body(get(f.name)))
    f <- f[grepl(pattern = "\\(", x = f)]
    f <- sapply(X = strsplit(split = "\\(", x = f), FUN = function(x) x[1])
    unique(trimws(f[f != ""]))
}
getFNamesInFunction("Fun1")
[1] "sum"   "mean"  "c"     "print"

答案 4 :(得分:0)

BufReader<&mut File>

为您提供花括号之间的功能部分。

as.list(Fun1)[3]

因此

{
    sum(x, y)
    mean(x, y)
    c(x, y)
    print(x)
    print(y)
}

在出现第一个“ gsub( ").*$", "", as.list(Fun1)[3]) ”之前给出了所有内容,这可以推测出第一个函数的名称。

以此为出发点,你应该能够包含一个循环,它给你其他功能,而不是第一个只有第一个。