2013-05-10 4 views
4

어디에서 누락 되었습니까? 나는 재미 할당을 선택하면 (예상대로)목록에 함수 바인딩하기

FUN<-list() 
make.FUN<-function(i) function(n) i+n 
for (i in 1:3) FUN[[i]]<-make.FUN(i) 
FUN[[1]](1) 

나는 중첩 된 함수에 대한 참조를 가져 :

> FUN[[1]](1) 
[1] 4 
> 

내가 2를 기대하는 경우 :

> FUN 
[[1]] 
function (n) 
i + n 
<environment: 0x03adfad0> 

[[2]] 
function (n) 
i + n 
<environment: 0x03ae0834> 

[[3]] 
function (n) 
i + n 
<environment: 0x03ae0604> 

> 

문제는 내가 확인하는 경우이다 !

> FUN[[1]](1) 
[1] 2 
> FUN[[2]](3) 
[1] 5 
> 

I :

FUN[[1]]<-make.FUN(1) 
FUN[[2]]<-make.FUN(2) 
FUN[[3]]<-make.FUN(3) 

내가 정확한 답변을 얻을 : 내가 수동으로 목록의 각 요소에 할당하면, 다른 한편으로

(명확하게 마지막 값을 덮어 쓰기됩니다) do.call을 사용하여 문제를 해결할 수 있지만 첫 번째 루프에서 해석기가 무엇을 가정하는지 또는이 경우 do.call이 필수적인지는 알 수 없습니다. 내가하려고하면 :

FUN<-list() 
make.FUN<-function(i) function(n) i+n 
for (i in 1:3) FUN[[i]]<-do.call('make.FUN',list(i)) 

은 내가 (예상대로) 얻을 :

> FUN[[1]](2) 
[1] 3 

어떤 단서? (목록을 사용할 때만 발생합니다.)

답변

4

귀하의 질문은 대부분 문서의 force 예제의 복사하여 붙여 넣기입니다. 당신은 할 필요가 : ?force에서

FUN <- list() 
make.FUN <- function(i) { force(i); function(n) i+n } 
for (i in 1:3) FUN[[i]] <- make.FUN(i) 
FUN[[1]](1) 
# [1] 2 

관련 세부 정보 :

힘 힘 공식적인 인수의 평가. 인수가 어휘 범위 지정 규칙에 의해 클로저에 캡처되고 나중에 루프 또는 적용 함수에서 명시 적 지정 또는 암시 적 지정에 의해 변경되는 경우 유용 할 수 있습니다.

+0

감사합니다. ... 그것을 확인할 것입니다 ... – MSardelich