解析R函数名称,参数和返回值

时间:2017-11-08 20:18:08

标签: r reproducible-research

如何以编程方式解析函数,参数及其返回值的名称?

我有兴趣使用workplan http://xxxxxxxxxx.com/生成工作计划数据框,以自动化R数据分析工作流程。可以使用funA <- function(x){ y <- x + 2 y } funB <- function(y){ z <- y^2 z } 函数生成此类工作计划数据框。

我有一个R脚本,其中包含我想要使用的函数。例如:

drake::workplan

我想以编程方式生成如下所示的数据帧。如何解析函数名,参数和返回值,并使用 target command 1 y funA(5) 2 z funB(3) 或其他函数创建这样的data.frame?

my_plan <- drake::workplan(z=funB(5), y=funA(3))

人们可以像这样手动完成这个:

drake::make(my_plan)

然后使用以下命令运行工作流程:

{
    ...,
    success: successCallback,
    error: errorCallback
}

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用formals()

获取参数
funA <- function(x, b = "default"){
  y <- x + 2
  y
}    
formals(funA)

您还可以使用body()environment()

提取函数的正文和环境

无法获取函数的名称。一个函数没有真正的名字,一个名称​​指的是一个函数(如果你不知道这个名字,你怎么会知道要引用什么?)。

也无法获得返回值。在您的示例中,您可以通过手动解析函数的z来获取ybody(),但这是非常糟糕的主意,并且只会起作用如果以特定方式编写函数源。即使你这样做,也没有意义。 <{1}}和z在函数返回时被销毁。

也许你可以详细说明为什么你需要返回值和函数namen,我相信你还有另一种解决方法。

答案 1 :(得分:2)

假设您有这样的源文件:

funA <- function(x, y){
  y <- x + 2
  y

}

funB <- function(y){
  z <- y^2
  z

}

名为test.r,你可以这样做:

library(purrr)
library(dplyr)

fenv <- new.env()
parse("test.r") %>% 
  keep(is.language)  %>% 
  keep(~grepl(", function", toString(.x))) %>% 
  map(eval, envir=fenv) %>% 
  map_df(~{
    params <- list(names(formals(.x)))
    bdy <- deparse(body(.x))
    bdy <- bdy[length(bdy)-1]
    data_frame(target = trimws(bdy), params = params)
  }) %>% 
  mutate(fname = ls(fenv))

产生:

## # A tibble: 2 x 3
##   target    params fname
##    <chr>    <list> <chr>
## 1      y <chr [2]>  funA
## 2      z <chr [1]>  funB

这是脆弱的,但脆弱,因为它在eval和临时环境分配之前过滤掉了语言对象和函数。

我假设您可以从params列中提取参数名称,然后最终生成您需要的内容。