在R - 传递函数及其参数作为参数到顶级函数

时间:2015-11-21 18:50:02

标签: r functional-programming dynamic-programming

我正在尝试做一些比下面的例子更复杂的事情,但基本的想法是封装在这个例子中:

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的每个函数),只能将params作为列表传递。我不知道如何在FUN中为每个函数获取多个参数以传递给适当的FUN。

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

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

1 个答案:

答案 0 :(得分:0)

像这样使用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)

给出相同的结果。