Объяснение 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
, как я, и если мне нужно изменить что-то еще вместе с ним.
Ответы
Ответ 1
Вырезание некоторых углов здесь... Выражения -option устанавливают максимальное количество вложенных выражений, которые будут оцениваться. При глубокой рекурсии значение по умолчанию иногда превышает, и увеличение значения часто решает проблему. Но если это не так (появляется новое сообщение об ошибке), вам может потребоваться дополнительно увеличить размер стека защиты. Компьютеры хранят информацию об активных подпрограммах в пакетах. Иногда, когда информация не подходит для стека, информация записывается за границу стеков, что плохо, поскольку она обычно создает, например, проблемы с доступом к памяти. Это можно устранить, установив параметр -max-ppsize при запуске R. Это, как предоставление ребенку более крупной бумаги, когда он или она перегружает текущую бумагу, а также окрашивает таблицу.
Дополнительные сведения см. в Wikipedia и их ссылках. Подробнее о параметрах командной строки R см. Введение в R, раздел B.1.
Ответ 2
Я предполагаю, что такой сайт не подходит для общего краш-курса по информатике, но в вашем случае есть совпадение между именем сайта и вопросом: у вас переполнение стека!: -)
В информатике стек представляет собой структуру данных, в которой вы можете получить доступ только к ее последнему элементу (например, к половине очереди). Для получения дополнительной информации см., Например, Wikipedia или CMU. Стеки играют центральную роль при вызове функций, так как там хранятся обратный адрес и часто используемые аргументы. Возврат из функции просто означает получение адреса возврата из стека и продолжение выполнения программы из точки в коде, указанном этим адресом.
Поскольку вы применяете рекурсию в своем коде (вызывая функцию изнутри самого себя), стек растет с каждым новым вызовом. В конце концов, у вашей программы не хватает памяти для хранения всего пакета.
См. также Memory в документации R.