Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-传递函数及其参数作为参数传递给高阶函数_R_Functional Programming_Dynamic Programming - Fatal编程技术网

R-传递函数及其参数作为参数传递给高阶函数

R-传递函数及其参数作为参数传递给高阶函数,r,functional-programming,dynamic-programming,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 <- funct

我试图做一些比我下面的例子复杂得多的事情,但基本思想概括在这个例子中:

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使用
do。像这样调用
,并修复
参数
,如图所示:

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)
如果你真的想要:

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

给出同样的结果。

非常感谢!我在发布这篇文章后不久就想出了do.call()方法,并打算发布我自己问题的答案,但我非常喜欢你的params[intersect(…)]方法。我可能不会在这个实现中使用它,但是现在我知道了这个技巧,我可以看到其他一些非常有用的应用程序,所以谢谢!
params2 <- list(x = 1, y = 2, z = 3, l = 4, m = 5, n = 6)
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)