R:在循环中定义函数

时间:2015-07-22 07:03:50

标签: r function

在循环中定义多个函数:

par <- 1:2    #parameters for functions
qF <- list()  #list I will write the functions into

for(i in 1:2){
  qF[[i]] <- function(p){qnorm(p, mean = par[i])}
}

我的结果:

>qF
[[1]]
function (p) 
{
qnorm(p, mean = par[i])
}

[[2]]
function (p) 
{
qnorm(p, mean = par[i])
}

功能相同!我想要的结果是什么:

>qF
[[1]]
function (p) 
{
 qnorm(p, mean = par[1])
}

[[2]]
 function (p) 
{
 qnorm(p, mean = par[2])
}

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

你可以这样做:

library(functional)

funcs = lapply(1:2, function(u) Curry(qnorm, mean=u)) 

funcs[[1]](0.77)
#[1] 1.738847

funcs[[2]](0.77)
#[1] 2.738847

或者,如果你不喜欢辛辣的饭菜:

funcs = lapply(1:2, function(u) function(...) qnorm(..., mean=u)) 

答案 1 :(得分:2)

如果要动态创建函数,每次都需要par[i]进行评估,否则在调用函数时将评估所有par[i]i将是for(i in 1:2){ qF[[i]] <- local({ mu <- par[i] function(...) { qnorm(..., mean = mu) } }) } 循环结束时的值。

substitute

您还可以将for(i in 1:2){ qF[[i]] <- eval(substitute( function(...) qnorm(..., mean = mu)), list(mu=par[i])) } 变量放入函数体

mu

您可以在每个功能的环境中看到sapply(qF, function(f) mget("mu", environment(f))) # $mu # [1] 1 # # $mu # [1] 2

functions.php