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)