如何在R中创建一个返回带有固定参数的函数的函数?

问题描述

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

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

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

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

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

现在,我想用输入 ffixed 编写一个函数 variable,它返回(未执行)函数 target,参数在 {{ 1}} 固定为 fixed 中的值。

我目前的结果:

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.callcallsubstitute 的组合一起使用 - 有谁知道如何?

deparse 的期望输出是:

f(fixed = c(b1 = 1,o1 = 5),variable = c("o2","b2"))

编辑

定义主体通过

function (o2,b2) 
target(b1 = 1,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")) 除外)。

解决方法

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

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,o1 = 5),variable = c("o2","b2"))
#function (o2,b2) 
#target(b1 = 1,o1 = 5,o2 = o2,b2 = b2)
#<environment: 0x564b81f2ded8>

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...