如何在R中创建一个返回带有固定参数的函数的函数? [英] How to create a function that returns a function with fixed parameters in 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")
现在,我想用输入 fixed
和 variable
编写一个函数 f
返回给我(未执行的)函数 target
将 fixed
中的参数固定为 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.call
、call
、substitute
或 deparse
结合使用 - 有谁知道如何?
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屋!