Подтвердить что ты не робот

Объяснение R: опции (выражения =) для не-компьютерных ученых

Я написал рекурсивную функцию вида

foo=function(vars,i=2){
  **do something with vars**
  if(i==length(vars)){
    return(**something**)
  }else{
    foo(vars,i+1)
  }
}

length(vars) - около 1500. Когда я его выполнил, я получил ошибку

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

Достаточно честный, поэтому я увеличил

options(expressions=10000)

Затем он работает.

Но когда я прочитал справочный документ options относительно expressions=, я просто не понимаю, что он говорит. Кроме того, он предлагает

... Если вы увеличите его, вы также можете запустить R с большим защитный стек,...

Так может кто-то сказать мне, что происходит, если бы мне пришлось увеличить параметры expressions, как я, и если мне нужно изменить что-то еще вместе с ним.

4b9b3361

Ответ 1

Вырезание некоторых углов здесь... Выражения -option устанавливают максимальное количество вложенных выражений, которые будут оцениваться. При глубокой рекурсии значение по умолчанию иногда превышает, и увеличение значения часто решает проблему. Но если это не так (появляется новое сообщение об ошибке), вам может потребоваться дополнительно увеличить размер стека защиты. Компьютеры хранят информацию об активных подпрограммах в пакетах. Иногда, когда информация не подходит для стека, информация записывается за границу стеков, что плохо, поскольку она обычно создает, например, проблемы с доступом к памяти. Это можно устранить, установив параметр -max-ppsize при запуске R. Это, как предоставление ребенку более крупной бумаги, когда он или она перегружает текущую бумагу, а также окрашивает таблицу.

Дополнительные сведения см. в Wikipedia и их ссылках. Подробнее о параметрах командной строки R см. Введение в R, раздел B.1.

Ответ 2

Я предполагаю, что такой сайт не подходит для общего краш-курса по информатике, но в вашем случае есть совпадение между именем сайта и вопросом: у вас переполнение стека!: -)

В информатике стек представляет собой структуру данных, в которой вы можете получить доступ только к ее последнему элементу (например, к половине очереди). Для получения дополнительной информации см., Например, Wikipedia или CMU. Стеки играют центральную роль при вызове функций, так как там хранятся обратный адрес и часто используемые аргументы. Возврат из функции просто означает получение адреса возврата из стека и продолжение выполнения программы из точки в коде, указанном этим адресом.

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

См. также Memory в документации R.