2017-08-30 70 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