【问题标题】:How to create a function that returns a function with fixed parameters in R?如何在R中创建一个返回具有固定参数的函数的函数?
【发布时间】:2021-05-17 08:54:04
【问题描述】:

我有一些带有很多参数的 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")

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

到目前为止我的结果:

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 的组合一起使用 - 有人知道怎么做吗?

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() 除外)。

【问题讨论】:

    标签: r function call substitution do.call


    【解决方案1】:

    您可以使用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, 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
    

    【讨论】:

    • 也许你针对这个新问题提出了一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2018-07-19
    • 2021-12-13
    • 2021-03-02
    • 2019-08-01
    • 2015-10-17
    相关资源
    最近更新 更多