是否有一个R函数列出R脚本文件中的所有函数及其参数?
即。形式的输出:
func1(var1, var2)
func2(var4, var10)
.
.
.
func10(varA, varB)
答案 0 :(得分:7)
您可以创建一个新环境,在该环境中获取文件,然后使用lsf.str()列出其中的函数。
test.env <- new.env()
sys.source("myfile.R", envir = test.env)
lsf.str(envir=test.env)
rm(test.env)
或者如果你想把它包装成一个函数:
listFunctions <- function(filename) {
temp.env <- new.env()
sys.source(filename, envir = temp.env)
functions <- lsf.str(envir=temp.env)
rm(temp.env)
return(functions)
}
答案 1 :(得分:4)
使用[sys.
] source
具有在文件中执行源的非常不良的副作用。在最坏的情况下,这会产生安全问题,但即使是“良性”代码也可能在执行时出现意外的副作用。最多只需要不必要的时间(并且可能很多)。
实际上没有必要执行代码:它足以解析它,然后进行一些语法分析。
实际代码很简单:
file_parsed = parse(filename)
functions = Filter(is_function, file_parsed)
function_names = unlist(Map(function_name, functions))
然后你去,function_names
包含一个函数名称向量。扩展它以列出函数参数留给读者作为练习。提示:有两种方法。一个是eval
函数定义(现在我们知道它是一个函数定义,这是安全的);另一个是cheat
,只需获取function
调用的参数列表。
上面使用的功能的实现也不是特别困难。 R核心软件包中甚至可能存在一些东西(utils
有很多东西),但由于我对此不是很熟悉,所以我自己写了:
is_function = function (expr) {
if (! is_assign(expr))
return(FALSE)
value = expr[[3]]
is.call(value) && as.character(value[[1]]) == 'function'
}
function_name = function (expr)
as.character(expr[[2]])
is_assign = function (expr)
is.call(expr) && as.character(expr[[1]]) %in% c('=', '<-', 'assign')
这正确识别表单的函数声明
f = function (…) …
f <- function (…) …
assign('f', function (…) …)
它不适用于更复杂的代码,因为赋值可以是任意复杂的,并且通常只能通过实际执行代码来解析。但是,上述三种形式可能占实践中所有命名函数定义的99%。