2017-08-30 72 views
1

我想在循环中创建包含我的函数,但我没有被评估。分配函数时递增?

例如,环:

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

+0

什么是'x'?你想要一个字符串的值吗? – www

回答

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值是来自环境是不同的。

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