如何在R中创建一个返回带有固定参数的函数的函数? [英] How to create a function that returns a function with fixed parameters in R?

查看:35
本文介绍了如何在R中创建一个返回带有固定参数的函数的函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些带有很多参数的 R 函数 target:

I have some R-function target with a lot of parameters:

target = function(b1,b2,l1,l2,l3,o1,o2) return((b1+b2+l1+l2+l3+o1+o2)^2)

target的一些参数应该保持固定(存储在命名向量fixed中),一些参数应该是可变的(它们的名字存储在向量中)变量):

Some parameters of target should be kept fixed (stored in the named vector fixed) and some parameters should be variable (their names are stored in the vector variable):

fixed = c(b1 = 1, l1 = 2, l2 = 3, l3 = 4, o1 = 5)

variable = c("o2","b2")

现在,我想用输入 fixedvariable 编写一个函数 f 返回给我(未执行的)函数 targetfixed 中的参数固定为 fixed 中的值.

Now, I want to write a function f with the inputs fixed and variable that returns me the (not executed) function target with the parameters in fixed fixed at the values in fixed.

我目前的结果:

f = function(fixed, variable){
  
  ### create the new "target" function with fixed parameters
  target_new = function() {}
  
  ### create the arguments
  formals(target_new) = setNames(rep(list(bquote()), length(variable)), variable) 
  
  ### create the body
  body(target_new) = call("target",fixed,variable)
  
  ### return the new "target" function with fixed parameters
  return(target_new) 
}

我无法创建身体.它应该与 do.callcallsubstitutedeparse 结合使用 - 有谁知道如何?

I fail to create the body. It should work with a combination of do.call, call, substitute or deparse - does anyone know how?

f(fixed = c(b1 = 1, l1 = 2, l2 = 3, l3 = 4, o1 = 5), variable = c(o2",b2")的期望输出)) 是:

function (o2, b2) 
target(b1 = 1, l1 = 2, l2 = 3, l3 = 4, o1 = 5, o2 = o2, b2 = b2)

编辑

定义主体通过

### create the body
arguments = c(paste(variable,"=",variable), paste(names(fixed),"=",fixed))
body(f) = call("target",arguments)

收益

function (o2, b2) 
target(c("b1 = 1", "l1 = 2", "l2 = 3", "l3 = 4", "o1 = 5", "o2 = o2", "b2 = b2"))

这几乎是所需的输出(除了引号和 c()).

which is almost the desired output (except for the quotation marks and the c()).

推荐答案

您可以使用 do.call 并将 as.symbol 分配给 变量.

You can use do.call and assign as.symbol to the variable.

target <- function(b1,b2,l1,l2,l3,o1,o2) return((b1+b2+l1+l2+l3+o1+o2)^2)
fixed <- c(b1 = 1, l1 = 2, l2 = 3, l3 = 4, o1 = 5)
variable <- c("o2","b2")

f <- function(fixed, variable) {
  target_new <- function() {}
  formals(target_new) <- setNames(rep(list(bquote()), length(variable)), variable) 

  for(i in variable) assign(i, as.symbol(i))
  body(target_new) <- do.call("call", unlist(list("target",  as.list(fixed), mget(variable))))

  target_new
}

f(fixed = c(b1 = 1, l1 = 2, l2 = 3, l3 = 4, o1 = 5), variable = c("o2","b2"))
#function (o2, b2) 
#target(b1 = 1, l1 = 2, l2 = 3, l3 = 4, o1 = 5, o2 = o2, b2 = b2)
#<environment: 0x564b81f2ded8>

f(fixed, variable)(3, 4)
#[1] 484

这篇关于如何在R中创建一个返回带有固定参数的函数的函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆