我试图从函数列表和要传递给这些函数的参数列表创建新函数,但到目前为止我无法这样做.请参阅下面的示例.
fun_list <- list(f = function(x, params) {x+params[1]},
z = function(a, params) {a * params[1] * params[2]})
params_list <- list(f = 1, z = c(3, 5))
# goal is to create 2 new functions in global environment
# fnew <- function(x) {x+1}
# znew <- function(a) {a*3*5}
# I've tried
for(x in names(fun_list)){
force(x)
assign(paste0(x, "new"), function(...) fun_list[[x]] (..., params = params_list[[x]]))
}
Run Code Online (Sandbox Code Playgroud)
目标是动态地为任意函数和参数执行此操作.
好吧,force()在for循环中不起作用,因为for循环不会创建新的环境.基于我之前的一个问题,我创建了一个capture()函数
capture <- function(...) {
vars <- sapply(substitute(...()), deparse);
pf <- parent.frame();
Map(assign, vars, mget(vars, envir=pf, inherits = TRUE), MoreArgs=list(envir=pf))
}
Run Code Online (Sandbox Code Playgroud)
这允许
for(x in names(fun_list)) {
f = local({
capture(x);
p = params_list[[x]];
f = fun_list[[x]];
function(x) f(x, p)
})
assign(paste0(x, "new"), f)
}
Run Code Online (Sandbox Code Playgroud)
我们为函数创建一个本地私有环境来存储它们的默认参数值.
这使
fnew(2)
# [1] 3
znew(2)
# [1] 30
Run Code Online (Sandbox Code Playgroud)