使用功能列表和要传递的功能参数列表创建新功能

k13*_*k13 4 r

我试图从函数列表和要传递给这些函数的参数列表创建新函数,但到目前为止我无法这样做.请参阅下面的示例.

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)

目标是动态地为任意函数和参数执行此操作.

MrF*_*ick 7

好吧,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)