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

use*_*988 4 r

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

即表格的输出:

func1(var1, var2)
func2(var4, var10)
.
.
.
func10(varA, varB)
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 8

使用 [ 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)

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

  1. f = function (…) …
  2. f <- function (…) …
  3. assign('f', function (…) …)

它不适用于更复杂的代码,因为赋值可以是任意复杂的,并且通常只能通过实际执行代码才能解决。但是,以上三种形式大概可以解释?99% 的命名函数定义在实践中。


Ale*_*pov 7

您可以创建一个新环境,在该环境中获取文件,然后使用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)