在循环中定义多个函数:
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])
}
有没有办法做到这一点?
答案 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