R: противоречивое поведение при добавлении чисел в матрицах - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь выполнить упражнение на последовательности Фибоначчи в R. Суть в том, что животные смертны. Цель состоит в том, чтобы ввести 3 переменные (продолжительность жизни, общая продолжительность, количество потомков). Животным требуется 1 единица времени для созревания. Чтобы решить эту проблему, я создаю матрицу с таймером в первом ряду, числом пар потомков во втором ряду, затем зрелыми парами, затем суммой потомков и зрелых пар. Я принимаю во внимание смертность, вычитая из зрелых животных количество животных, которые родились "я" несколько месяцев назад (i = продолжительность жизни)

vec <- vector()

wabbits3 <- function(i,k,l) {
  wabbits3_chabo(i,k,l,1,0, vec, 1, i)
}

wabbits3_chabo <- function(i,k,l,m,n,t,o,p){
  if (k == 0) {print(t)}
  else if (p == 1) {wabbits3_chabo(i, (k-1), l,
                   ((n+m-(t[2,(ncol(t)-i+1)]))*l),
                   (n+m-(t[2,(ncol(t)-i+1)])),
                   cbind(t, c((o),
                              (m),
                              (n),
                              (m+n))),
                   (o+1),
                   1)}
  else {wabbits3_chabo(i, (k-1), l,
                   (n*l),
                   (n+m),
                   cbind(t, c((o),
                              (m),
                              (n),
                              (m+n))),
                   (o+1),
                   (p-1))}
}

Теперь к актуальному вопросу: если я проверю числа: wabbits3(365, 6, 1), он никогда не войдет в ветвь else if, так как никогда не достигнет p = 1, и все работает нормально. Но при выборе меньших чисел (wabbits3(3, 6, 1)) он входит в ветку else if, и добавление "(m+n)" больше не работает. Команда cbind точно такая же в ветвях "if" и "e lse if", так почему же она не работает оба раза?

Результат wabbits3(365, 6, 1):

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    1    0    1    1    2    3
[3,]    0    1    1    2    3    5
[4,]    1    1    2    3    5    8

(сумма во втором и третьем ряду, отображаемая в четвертом ряду работает)

Результат wabbits3(3, 6, 1)

     [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    2    3    4    5    6
 [2,]    1    0    1    4    5    6
 [3,]    0    1    1    4    5    6
 [4,]    1    1    2    4    5    6

(добавление второй и третьей строки больше не работает, когда оно входит в ветку else if (в четвертом столбце))

Моя проблема понятна? Что-нибудь неясно? Заранее спасибо!

PS .: Я уверен, что в моем коде есть другие ошибки, но я бы предпочел найти их самостоятельно. Прямо сейчас я просто сбит с толку, почему это так просто, как дополнение не работает ...

РЕДАКТИРОВАТЬ: Оказывается, простое использование rbind (в обеих ветвях, конечно) может решить проблему ... Но почему?!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...