是否有一个R函数列出R脚本文件中的所有函数及其参数?
即表格的输出:
func1(var1, var2)
func2(var4, var10)
.
.
.
func10(varA, varB)
Run Code Online (Sandbox Code Playgroud)
使用 [ sys.]source具有在文件内执行源的非常不受欢迎的副作用。在最坏的情况下,这会带来安全问题,但即使是“良性”代码在执行时也可能会产生意想不到的副作用。充其量只是需要不必要的时间(并且可能需要很多时间)。
不过,实际上没有必要执行代码:解析它,然后进行一些语法分析就足够了。
实际代码很简单:
file_parsed = parse(filename)
functions = Filter(is_function, file_parsed)
function_names = unlist(Map(function_name, functions))
Run Code Online (Sandbox Code Playgroud)
你去吧,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')
Run Code Online (Sandbox Code Playgroud)
这可以正确识别表单的函数声明
f = function (…) …f <- function (…) …assign('f', function (…) …)它不适用于更复杂的代码,因为赋值可以是任意复杂的,并且通常只能通过实际执行代码才能解决。但是,以上三种形式大概可以解释?99% 的命名函数定义在实践中。
您可以创建一个新环境,在该环境中获取文件,然后使用lsf.str()列出其中的函数
test.env <- new.env()
sys.source("myfile.R", envir = test.env)
lsf.str(envir=test.env)
rm(test.env)
Run Code Online (Sandbox Code Playgroud)
或者如果你想把它包装成一个函数:
listFunctions <- function(filename) {
temp.env <- new.env()
sys.source(filename, envir = temp.env)
functions <- lsf.str(envir=temp.env)
rm(temp.env)
return(functions)
}
Run Code Online (Sandbox Code Playgroud)