2015-06-05 3 views
-2

Я пытаюсь написать простую рекурсивную функцию в R, которая каждый раз возвращает только одно число. Я хочу сохранить их в столбце в основном. Так что сначала я объявляю что-то вроде relevant=c(rep(0,16)) тогда, если она удовлетворяет определенные критерии, которые я хочу изменить соответствующие значения соответствующих [J] к 1. if(something==1){ relevant[j]=1 }Вывод из рекурсивной функции R

Но тогда, когда я звоню отношение вне функция все значения равны 0. Критерии, безусловно, удовлетворяются, но они просто не меняют значения!

Любая помощь будет оценена!

+2

добавьте свою «достаточно простую рекурсивную функцию» и желаемый результат (вы можете увидеть [здесь] (http://stackoverflow.com/help/how-to-ask), чтобы помочь вам изменить свой вопрос, чтобы было проще для нас ответить) – Cath

+0

Попробовал немного уточнить, но если еще не ясно, дайте мне знать –

+0

поможет ли любой из нижеприведенных ответов? если нет, можете ли вы объяснить, почему? Мне все еще не ясно, что именно вы хотите сделать: с дальнейшим объяснением я не вижу, где вам нужна рекурсивная функция (или даже функция). Пожалуйста, добавьте свою фактическую функцию и то, что вы ожидаете в качестве вывода – Cath

ответ

2

Вот «достаточно простая рекурсивная функция», которая возвращает вектор чисел, каждое из которых вычисляется внутри функции:

serf <- function(x){ 
      if (length(x)==5) { 
       return(x) 
      } else { 
       x <- c(x, x[length(x)]+1) ; serf(x) 
      } 
     } 


serf(1) 
#[1] 1 2 3 4 5 

Это то, что вы имели в виду?

2

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

Вот пример, основанный на вычислении чисел Фибоначчи, который решает эту проблему, используя замыкание. Пара предостережений: (1) Это ужасно неэффективный способ вычисления чисел Фибоначчи. (2) Создание объекта, такого как values, не очень эффективно в R; если вы знаете длину результата заранее, гораздо лучше инициализировать объект до этой длины, а затем индексировать его.

> makefib <- function(){ 
+ values <- vector("numeric") 
+ function(n){ 
+  if (n == 0) return(values) 
+  res <- if (n < 3) 1 else Recall(n - 1) + Recall(n - 2) 
+  values[length(values) + 1] <<- res 
+  res 
+ } 
+ } 

> fib <- makefib() 
> fib(6) 
[1] 8 
> fib(0) 
[1] 1 1 2 1 3 1 1 2 5 1 1 2 1 3 8 

Надеюсь, это поможет.