如何列出R文件中的所有函数签名?

如何列出R文件中的所有函数签名?,r,R,是否有一个R函数列出R脚本文件中的所有函数及其参数 i、 e.表格的输出: func1(var1, var2) func2(var4, var10) . . . func10(varA, varB) 更新:请参考@Konrad Rudolph的答案 您可以创建一个新环境,在该环境中创建文件源,然后使用lsf.str()列出其中的函数,例如 test.env使用[sys.]source会产生非常不良的副作用,即在文件内部执行源代码。在最坏的情况下,这会带来安全问题,但即使是“良性”代码在执行时也

是否有一个R函数列出R脚本文件中的所有函数及其参数

i、 e.表格的输出:

func1(var1, var2)
func2(var4, var10)
.
.
.
func10(varA, varB)

更新:请参考@Konrad Rudolph的答案

您可以创建一个新环境,在该环境中创建文件源,然后使用lsf.str()列出其中的函数,例如


test.env使用[
sys.
]
source
会产生非常不良的副作用,即在文件内部执行源代码。在最坏的情况下,这会带来安全问题,但即使是“良性”代码在执行时也可能会产生意外的副作用。充其量只是需要不必要的时间(而且可能需要很多时间)

不过,实际上不需要执行代码:只需解析代码,然后进行一些语法分析就足够了

实际代码很简单:

file_parsed = parse(filename)
functions = Filter(is_function, file_parsed)
function_names = unlist(Map(function_name, functions))
接下来,
函数名
包含函数名向量。将其扩展为同时列出函数参数将留给读者作为练习。提示:有两种方法。一种是评估函数定义(现在我们知道它是函数定义,这是安全的);另一种方法是
欺骗
,只获取
函数
调用的参数列表

上述功能的实现也不是特别困难。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')
is_function=function(expr){
如果(!is_assign(expr))
返回(假)
值=expr[[3]]
is.call(值)&&as.character(值[[1]])==“函数”
}
函数名称=函数(expr)
as.character(expr[[2]])
is_assign=函数(expr)

is.call(expr)和&as.character(expr[[1]])%在%c(“=”,“太棒了!正是我想要的。谢谢!这不是正确的答案。请查看@Konrad Rudolph的答案
file_parsed = parse(filename)
functions = Filter(is_function, file_parsed)
function_names = unlist(Map(function_name, functions))
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')