假设我有一个名为Fun1
的函数,我在其中使用R的许多不同的内置函数用于不同的不同进程。然后,我如何获得此函数Fun1
Fun1 <- function(x,y){
sum(x,y)
mean(x,y)
c(x,y)
print(x)
print(y)
}
所以我的输出应该像字符列表,即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)"
看起来没问题,但参数不应该是x
和y
。这里只是函数体Fun1
体内使用的函数名列表。
所以我的总体目标是打印unique list of in-built functions or any create functions inside a particular function
,Fun1
。
对此的任何帮助都非常感谢。感谢。
答案 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])
”之前给出了所有内容,这可以推测出第一个函数的名称。
以此为出发点,你应该能够包含一个循环,它给你其他功能,而不是第一个只有第一个。