简体   繁体   English

如何通过 ZC1C425268E68385D1AB50741C 将 function arguments 集中到 R 中的向量中?

[英]How to concentrate function arguments into a vector in R by a function?

I have some R-function f , which fixes some parameters of some other function target (thanks to GKi for help ):我有一些 R-function f ,它修复了一些其他 function target的一些参数(感谢GKi 的帮助):

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", mget(variable), as.list(fixed))))
  
  return(target_new)
}

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

I want to maximize target_new by nlm, so I need to concentrate its function arguments into a vector, ie the desired output of f(fixed,variable) is我想通过nlm最大化target_new ,所以我需要将它的function arguments集中到一个向量中,即所需的output为f(fixed,variable)

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

How to modify the above code, so that the function can process the vector theta ?如何修改上述代码,使 function 可以处理向量theta

Please mind that the vectors fixed and variable can be of variable lengths.请注意, fixed向量和variable向量可以是可变长度的。

You are making this too complicated.你把这弄得太复杂了。

f <- function(fixed, variable) {

  function(theta) {
    args <- c(as.list(theta), as.list(fixed))
    names(args)[seq_along(variable)] <- variable
    do.call(target, args)
  }

}

fun <- f(fixed, variable)

#does it work?
all.equal(
  nlm(fun, p = c(1, 2)),
  nlm(function(theta) target(1,theta[2], 2, 3, 4, 5, theta[1]),
    p = c(1, 2))
)
#[1] TRUE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM