【问题标题】:R: Defining functions within a loopR:在循环中定义函数
【发布时间】:2015-07-22 07:03:50
【问题描述】:

在一个循环中定义多个函数:

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])
}

有什么办法吗?

【问题讨论】:

  • 我只是希望这不会导致eval(parse())...

标签: r function


【解决方案1】:

你可以这样做:

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)) 

【讨论】:

  • unCurried 版本仅适用于 R 3.2 或更高版本,因为该版本通过 lapply 和惰性评估修复了疣。
  • 没问题 ;) 但只有一个建议:玩 eval、get 和显式 for 循环显然不是编码/学习 R 的方法!最好有更短、更高级的编码方法!
【解决方案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

【讨论】:

  • 谢谢,这正是我想要的!
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多