如何以编程方式解析函数,参数及其返回值的名称?
我有兴趣使用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
}
谢谢。
答案 0 :(得分:2)
您可以使用formals()
funA <- function(x, b = "default"){
y <- x + 2
y
}
formals(funA)
您还可以使用body()
和environment()
无法获取函数的名称。一个函数没有真正的名字,一个名称指的是一个函数(如果你不知道这个名字,你怎么会知道要引用什么?)。
也无法获得返回值。在您的示例中,您可以通过手动解析函数的z
来获取y
和body()
,但这是非常糟糕的主意,并且只会起作用如果以特定方式编写函数源。即使你这样做,也没有意义。 <{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
列中提取参数名称,然后最终生成您需要的内容。