分配功能时增加i?

时间:2017-08-30 18:14:46

标签: r

我试图在循环中创建包含i的函数,但我还没有被评估过。

例如,循环:

func <- list(0)
for (i in 1:3) {
  func[[i]] <- function(x) i*x
}

产生

> func[[1]]
function(x) i * x
<bytecode: 0x0000000011316b08>

当我实际需要1 * x,2 * x,3 * x

2 个答案:

答案 0 :(得分:4)

编写一个返回函数的函数。请务必使用force()强制评估延迟参数。

func <- list(0)
makefun <- function(i) {
  force(i)
  function(x) i*x
}
func <- Map(makefun, 1:3)

func[[1]](5)
# [1] 5
func[[2]](5)
# [1] 10
func[[3]](5)
# [1] 15

您可以在local()的帮助下在for循环中执行此操作。

func <- list(0)
for (i in 1:3) {
    func[[i]] <- local({i<-i; function(x) i*x})
}

在这两种情况下,定义仍然看起来像"function(x) i*x",但i值来自的环境是不同的。

答案 1 :(得分:0)

问题在于,您的功能是指i,但只有一个i。MrFlick的答案是强制创建本地环境的一种方法i的不同副本具有不同的值;另一种方法是使用local(),例如

func <- list()
for (i in 1:3) {  
  func[[i]] <- local( 
    {
      j <- i # make a local copy of the current value
      function(x) j*x 
    } )
}

func[[1]](5)
# [1] 5
func[[2]](5)
# [1] 10
func[[3]](5)
# [1] 15