2013-05-10 3 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 я получаю ссылку на вложенной функции (как и ожидалось):

> 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] 4 
> 

, когда я ожидаю 2 ! (Очевидно, это перезапись последнего значения)

С другой стороны, если я вручную назначить для каждого элемента списка:

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

я получаю правильный ответ:

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

I может обходным путем использовать 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 из документа. Вам нужно сделать:

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 

Соответствующие детали из ?force:

сила вынуждает оценки формального аргумента. Это может быть полезно, если аргумент будет зафиксирован в закрытии по лексическим правилам определения и позже будет изменен явным назначением или неявным назначением в цикле или функции приложения.

+0

большое спасибо ... проверит его ... – MSardelich