2015-08-19 2 views
1

Я пишу программу, в которой мне нужна функция для вызова функции, которая была определена за период, который может снова вызвать функцию, которая была определена до себя и так далее. Тем не менее, я нахожу себя inable, чтобы это реализовать в R.Вызов функций из списка рекурсивно

Вот минимальный пример того, что я пытаюсь сделать:

functions <- list() 
functions[[1]] <- function(x){ 
    x 
} 

for (i in 2:10) 
{ 
    functions[[i]] <- function(x){ 
    functions[[i-1]](x) + x 
    } 
} 

Итак, после запуска этого сценария, что я хотел бы случиться что когда я звоню functions[[10]](1), это то, что R определяет значение, которое функция имела бы в периоде 9, для которого ему нужно значение функции в периоде 8 и т. д. и добавляет к ней вход. (Очевидно, что выход должен быть равен 10).

Проблема в том, что, когда я это делаю, функция вызывает себя бесконечно. Список выглядит следующим образом:

[[1]] 
function (x) 
{ 
    x 
} 

[[2]] 
function (x) 
{ 
    functions[[i - 1]](x) + x 
} 

[[3]] 
function (x) 
{ 
    functions[[i - 1]](x) + x 
} 

(...) 

Так что, когда я называю functions[[10]](x), он оценивает в functions[[9]](x) + x, но functions[[9]] затем продолжает называть себя снова и снова.

Есть ли что-нибудь, что я могу сделать, чтобы заставить R записать значение i - 1 в каждый элемент списка, чтобы он выглядел следующим образом?

[[1]] 
function (x) 
{ 
    x 
} 

[[2]] 
function (x) 
{ 
    functions[[1]](x) + x 
} 

[[3]] 
function (x) 
{ 
    functions[[2]](x) + x 
} 

(...) 

Или есть ли другой способ, которым я мог бы делать то, что я пытаюсь здесь сделать?

(Очевидно, что в приведенном выше примере я мог бы просто суммировать, но в приложении, которое я пытаюсь имитировать здесь, это невозможно, и я не могу придумать другого способа сделать это, кроме как каждой функции вызовите его перед ним).

+3

Посмотрите на [эту должность] (http://stackoverflow.com/questions/2247111/evaluating-variable-within-r-loop), может быть, после принятого решения, которое вы могли бы попробуйте 'функции [[i]] <- eval (parse (text = paste0 (" function (x) {functions [[", i-1,"]] (x) + x} ")))' – NicE

+1

Посмотрите функция '' formals (f) ''. Я приведу пример, показывающий, что я имею в виду – nathanesau

ответ

1

Держи

functions <- list() 
functions[[1]] <- function(x){ 
    x 
} 

for (i in 2:10) 
{ 
    functions[[i]] <- function(x,i){ 
     functions[[i-1]](x) + x 
    } 
    formals(functions[[i]])$i <- i 
} 
functions[[10]](5) 
# 50 
Смежные вопросы