如何在R文件中列出所有函数及其参数?

时间:2013-11-28 07:02:11

标签: r

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

即。形式的输出:

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

2 个答案:

答案 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')

这正确识别表单的函数声明

  1. f = function (…) …
  2. f <- function (…) …
  3. assign('f', function (…) …)
  4. 它不适用于更复杂的代码,因为赋值可以是任意复杂的,并且通常只能通过实际执行代码来解析。但是,上述三种形式可能占实践中所有命名函数定义的99%。