【问题标题】:In R - Passing functions and their parameters as parameters to top order function在 R 中 - 将函数及其参数作为参数传递给最高阶函数
【发布时间】:2016-02-24 03:42:17
【问题描述】:

我正在尝试做一些比我下面的示例复杂得多的事情,但基本思想封装在这个示例中:

pass_thru <- function(FUN,params){
  n <- length(FUN)
  out <- list()
  for(i in 1:n){
    temp <- get(FUN[i],mode="function")
    out[[i]] <- temp(params[[i]])
  }
  return(out)
}


fun1 <- function(x,y,z){
  x+y+z
}

fun2 <- function(l,m,n){
  l*m*n
}

FUN = c("fun1","fun2")
params = list(c(x=1,y=2,z=3,
                l=4,m=5,n=6))

pass_thru(FUN,params)

在 pass_thru() 中传递和解析 FUN 可以正常工作,但是仅当 params 的每个元素都是单个值(只有一个参数传递给 FUN 的每个函数)时,才能将参数作为列表传递。我不确定如何为 FUN 中的每个函数获取多个参数以传递给适当的 FUN。

我真正想做的是在对 pass_thru() 的调用中将一些参数传递给每个 FUN,并让 pass_thru 的主体计算要传递给 fun1 和 fun2 的其余参数。

我正在尝试为大规模数据分析预先创建一个灵活的架构,因此能够将函数以及任何或所有这些函数的参数传递给其他函数会很有帮助。感谢您对这个问题的任何见解!

【问题讨论】:

    标签: r functional-programming dynamic-programming


    【解决方案1】:

    像这样使用do.call,同时修复params,如图所示:

    params <- list(list(x = 1, y = 2, z = 3), list(l = 4, m = 5, n = 6))  
    pass_thru <- function(FUN, params) Map(do.call, FUN, params)
    
    pass_thru(FUN, params)
    

    给予:

    $fun1
    [1] 6
    
    $fun2
    [1] 120
    

    如果你真的想要:

    params2 <- list(x = 1, y = 2, z = 3, l = 4, m = 5, n = 6)
    

    然后试试这个,注意params[intersect(...)] 部分挑选出函数调用的相关参数:

    pass_thru2 <- function(FUN, params) {
       runf <- function(f) do.call(f, params[intersect(names(params), names(formals(f)))])
       lapply(FUN, runf)
    }
    
    pass_thru2(FUN, params2)
    

    给出相同的结果。

    【讨论】:

    • 非常感谢!我在发布此消息后不久就发现了 do.call() 方法,并打算发布我自己问题的答案,但我真的很喜欢你的 params[intersect(...)] 方法。我可能不会在这个实现中使用它,但现在我知道了这个技巧,我可以看到其他几个非常有用的应用程序,所以谢谢!
    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多